日期:2014-05-16  浏览次数:20712 次

六、触发器

触发器

??????触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。

????? 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

?

?

创建触发器:

?

create trigger 触发器名称
on 表名
for  动作(insert|update|delete)
as
    if update(recommend) --条件
begin
    触发器语句
end 
?

?

?

instead of 语句用于替换要执行的动作,如

?

?

create trigger 触发器名称
on 表名
instead of  动作(insert|update|delete)
as
begin
    触发器语句
end 
?

?

将不执行相应的动作而只执行触发器里自定义的语句

同理 instead of 替换成 after或者before 分别表示执行动作后和动作前执行

关键在于Inserted表

触发器语句中使用了两种特殊的表:deleted 表和 inserted


Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

?

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

?

1.插入操作(Insert)
Inserted表有数据,Deleted表无数据

2.删除操作(Delete)
Inserted表无数据,Deleted表有数据

3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)

?

?

?

删除触发器

?drop trigger 触发器名称

?drop trigger 触发器名称,触发器名称...? -------删除多个触发器


注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:
if Exists(select name from sysobjects where name=触发器名称 and xtype='TR')

?

重命名触发器

exec sp_rename 原名称, 新名称


sp_rename 是 SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

?

更多触发器相关....

(1) INSTEAD OF子句
执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
create trigger f
on tbl
instead of delete
as
??? insert into Logs...

(2) IF UPDATE(列名) 子句
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
on?tbl
for?update
as
??? if update(status)?or update(title)
??????? sql_statement --更新了 status 或 title 列

(3) inserteddeleted (两个临时表的使用)
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
????declare @title varchar(200)
????select @title=title from deleted
??? insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')
说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是?null。

查看数据库中所有的触发器

?

use 数据库名
go
select * from sysobjects where xtype='TR'

sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。

sp_helptext 查看触发器内容

?

use 数据库名
go
exec sp_helptext '触发器名称'

将会以表的样式显示触发器内容。
除了触发器外,sp_helptext