if update(column):用于测试在指定的列上进行的insert或update操作,不能用于delete操作。可以指定多列。因为在on子句中指定了表名,所以在if update子句中的列名前不要包含表名。若要测试在多个列上进行的insert或update操作,请在第一个操作后指定单独的update(column)子句。在insert操作中,if update高尔夫球返回true值,因为这些列插入了显式值或隐性值(null)。
if (columns_updated()):用于测试是否插入或更新了所涉及的列,仅用于insert或update触发器中。
当创建触发器时,如果使用了相同名称的触发器,后建立的触发器将会覆盖前面创建的触发器。用户不能在系统表上创建用户自定义的触发器。 例:创建一个触发器,在titles表上创建一个插入、更新类型的触发器。 程序如下: use pubs
if exists(select name from sysobjects where name=’reminder’ and type=’tr’)
drop trigger reminder
go
create trigger reminder
on titles
for insert,update
as sql_statements
go 注意:有两个表应知道,deleted表存储delete和update所影响的行的副本,inserted表存储insert和update所影响的行的副本。 二、查看、修改和删除触发器 1.查看触发器 如果要显示作用于表上的触发器究竟对表有哪些操作,必须查看触发器信息。在sql server中,有多种方法可以查看触发器信息,其中常用的有两种: (1)使用企业管理器查看触发器信息。 (2)使用系统存储过程查看触发器。 系统存储过程sp_help、sp_helptext和sp_depends分别提供有关触发器的不同信息。其具体用途和语法形式如下。
2.修改触发器 通过企业管理器和系统过程或者transact-sql命令,可以修改触发器的名称和正文。 (1)使用企业管理器修改触发器正文。 (2)使用sp_rename命令修改触发器的名称。 语法形式如下: sp_rename oldname,newname (3)使用alter trigger命令修改触发器正文。 语法形式如下: alter trigger trigger_name
on(table | view)
[with encryption]
{
{(for | after | instead of){[delete][,][insert][,][update]}
[not for replication]
as
sql_statement[...n]}
|
{(for | after | instead of){[insert][,][update]}
[not for replication]
as
{if update(column)
[{and | or}update(column)]
[...n]
| if (columns_updated(){bitwise_operator}updated_bitmask)
{comparison_operator}column_bitmask[...n]
}
sql_statement[...n]
}
} 3.删除触发器 由于某种原因,需要从表中删除触发器或者需要使用新的触发器,这就必须首先删除旧的触发器。只有触发器所有者才有权删除触发器。删除已创建的触发器有三种方法: (1)使用系统命令drop trigger删除指定的触发器。其语法形式如下: drop trigger{trigger}[,..n] (2)删除触发器所在的表。删除表时,系统将会自动删除与该表相关的触发器。 (3)在企业管理器中,右击要删除的触发器所在的表,从弹出的菜单中依次选择“所有任务–管理触发器”,则会出现触发器属性对话框,在名称选项框中选择要删除的触发器,然后单击“删除”即可。 三、触发器的应用 1.使用insert触发器 insert触发器通常被用于更新时间标记字段,或者验证被触发器监控的字段中数据满足要求的标准, 以确保数据的完整性。当向数据库中插入数据时,insert触发器将被触发执行。insert触发器被触发时,新的记录增加到触发器对应的表中,并且同时也添加到一个插入表中。该插入表是一个逻辑表,以确定该触发器的操作是否应该执行以及如何去执行。 例:创建一个在表score中检查插入的成绩是否在0到100之间的触发器。 程序如下: use test
create table score
(
student_no int,
score int
) if exists(select name from sysobjects where name=’check_score’ and type=’tp’)
drop trigger check_score
go create trigger check_score
on score
for insert,update
as
declare @score int
select @score=score from inserted
if @score<0 or @score>100
begin
rollback
raiserror(’成绩必须在0到100之间!’,16,1)
end
go 如果此时插入一笔记录: insert score values(985240,150) 则会出现出错提示。同样在更新记录时,如果修改后的数据不满足要求,也会出现上述错误信息。
2.使用delete触发器 delete触发器通常用于两种情况,第一种情况是为了防止那些确定需要删除但传统引起数据一致性问题的记录的删除,如在雇员信息表中删除记录时,同时要删除和该雇员有关的其他信息表。通常见于那些用作其他表的外部键的记录,。第二种情况是执行可删除主记录的子记录的级联删除操作。可以使用这样的触发器从主销售记录中删除所有的定单项。 例:score表中包含学生的学号和成绩,如果还存在一个t1表,其中包含学生的学号和姓名,它们之间以学号相关联。 如果要删除t1表中的记录,则与该记录的学号对应的学生成绩也应该删除: insert score values(995240,85)
go create trigger delete_trigger
on t1
for delete
as
delete score where score.student_no=deleted.student_number
go 此时,要删除t1表中的记录: delete t1 where student_number=995240 则score表中对应的记录也被删除。如果使用select语句来查询score表,将看到该记录已经被删除。 3.使用嵌套的触发器 如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器,…,这些触发器就是嵌套触发器。触发器可嵌套至32层,并且可以控制是否可以通过“嵌套触发器”服务器配置选项进行触发器嵌套。如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。在执行过程中,如果一个触发器修改某个表,而这个表已经有其他触发器,这时就要使用嵌套触发器。 设置递归触发器选项的操作步骤如下: (1)打开企业管理器,展开服务器组,展开服务器; (2)展开数据库文件夹,右击要更改的数据库,单击“属性”; (3)单击“选项”标签,如果允许递归触发器,则可以选择“设置”中的“递归触发器”复选框。