数据库-DML触发器

来源:互联网 发布:淘宝怎么加入虚拟卖家 编辑:程序博客网 时间:2024/06/08 04:26

  Microsoft Sql Server 2008系统中提供了两种强制业务逻辑和数据完整性的机制,即约束技术和触发器技术。

触发器的概念及类型 

一般地认为,触发器是一种特殊的存储过程,它包含大量的Transact-SQL语句。但是存储过程与触发器还是有一些不同,存储过程可以由用户直接调用执行,而触发器不能被直接调用,只能自动执行。

按照触发事件的不同,可以把触发器分为两种,即DML触发器和DDL触发器。

DML触发器类型

1.按照触发事件的类型,可以把Microsoft SQL Server 2008提供的DML触发器分为三种类型:分别是INSERT类型、UPDATE类型、DELETE类型,这些也是DML触发器的基本类型,顾名思义,INSERT类型,就是往表中插入数据时,触发的触发器。而另为两种,同理。

2.按照触发器和触发事件的操作时间划分,可以把DML触发器分为ALTER触发器和INSTEAD OF触发器。当INSERT,UPDATE,DELETE语句执行之后才执行DML触发器的操作时,这时的触发器类型是ALTER触发器。ALTER触发器只能用于在表上的定义。如果想使用触发器操作代替触发事件的操作,可以使用INSTEAD OF类型的触发器。也就是说,INSTEAD OF类型的触发器可以代替INSERT、UPDATE、DELETE触发事件的操作。INSTEAD OF触发器可以建立在表上也可以建立在视图上。通过在视图上建立触发器,可以大大增强通过视图修改表中数据的功能。

DML触发器的使用

DMl触发器主要的作用是维护行级数据的完整性,而不是返回结果。只所以使用触发器,是因为触发器中可以包含非常复杂的过程逻辑。DML触发器可以实现比约束强制更加复杂的数据完整性。

DML可以一连串的更新数据库中相关表的数据。比如,在school数据库中,teacher表上有一个DELETE类型的触发器,该触发器可以删除其他表中与该表中被删除记录teacher_id相匹配的记录。在触发器中,通过使用teacher_id,在其他的表中定位匹配的行为来执行级联删除操作。

确保复杂的数据参考完整性地方法:

1.     执行操作或级联操作,参考完整性可以在CREATE TABLE语句中,通过使用外键约束定义。当级联删除或必须进行修改时,触发器确保相应操作。

2.     创建多行触发器,当插入、删除、修改多个记录行时,必须使用能过处理多行记录的触发器

3.     自定义错误提示信息。

4.     比较修改前后数据的状态,通过insert、update和delete语句,触发器可以提高参考数据的变化情况。

5.     约束优于触发器检查,如果触发器表上有约束,这些约束是在触发器执行之前检查的,如果触发器操作与约束有冲突,则不执行触发器

6.     表可以有应用于任意操作的多个触发器

7.     表的所有者必须要有执行全部触发器定义中语句的许可。

8.     触发器不应该返回结果集

创建触发器

触发器是一种特殊的存储过程,所以DML触发器的创建存储过程的创建方式很相似。

创建DML触发器的CREATE TRIGGER语句的基本语法形式如下:

CREATE TRIGGERtrigger_name

ON table_name_or_view_name

With ENCRYPTION

{FOR|AFTER|INSTEAD OF}

{[DELETE][,][INSERT][,][UPDATE]}

AS

Sql_statement

解释:

1.trigger_name是触发器的名称

2.      table_name_or_view_name指定DML触发器的基表或基视图

3.      FOR|AFTER|INSTEADOF用于指定触发器发生的时间,FORAFTER作用是相同的

4.      [DELETE][,][INSERT][,][UPDATE]指定触发事件的关键字,可以一次指定一个事件、也可以是多个

注意事项:虽然触发器中可以包含许多的Transact-SQL语句,但是,仍有一些语句是不能用在触发器中的

1.     CREATE DATABASEALTER DATABASEDROP DATABASERESRORE DATABASE等语句

2.     不允许对基表执行修改和删除操作

3.     CREATE INDEXALTER INDEXDROP INDEX

4.     RECONFIGURE语句

下面举一些实例进行演示:

  我的实例是这样:我有table1table2两个张表,我想做到:我对当我对table1进行增、删、改记录时,table2能过记录,对table1做的是什么操作还有操作的数是什么,是对哪一条记录做了修改

 首先建立两个表table1table2

 1.table1的创建

 createtabletable1(

[id] intnotnull identity(1,1)primarykey,

[money] int not null

);

2.table2的创建

create tabletable2(

[id] intnotnull identity(1,1)primarykey,

[type] varchar(50)notnull,

[money] int not null,

[table1_id] int not null

);

创建DML触发器

1.     insert类型的触发器

create triggert_table1_insert

ON table1

with encryption

for insert

as

declare @a int

declare @b int

select @a=[money],@b=[id]

from inserted

insert intotable2([type],[money],[table1_id])values('insert',@a,@b)

go

2. update类型的DML触发器

create triggert_table1_update

ON table1

with encryption

for update

as

declare @a int

declare @b int

select @a=[money],@b=[id]

from inserted

insert intotable2([type],[money],[table1_id])values('update',@a,@b)

go

同上理,可以自己写下delete类型的DML

测试时很重要:

1.     insert测试

insert into table1([money])values('insert',100)

查看table1table2表的变化

 select*from table1

select *fromtable2

2.   update测试

update table1set[money]=400whereid=1

  查看table1table2表的变化

 select*fromtable1

select *fromtable2

delete类型的可以自己试试写

查看触发器的内容有多种方式:

1.    在对象资源管理器中,点开基表前的小’+’,就能在下拉菜单中看到触发器的字样

2.    通过SQl命令显示

Exec sp_helptext ‘触发器的名称’go

Select * from sys.triggers go

这个可以显示所有的触发器的信息

 

0 0
原创粉丝点击