触发器能够使用自定义信息和较为复杂的错误处理;
c、DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。
d、一个表中的同一个修改语句的DML触发器,允许被多个不同的操作(INSERT、UPDATE 或 DELETE)来响应;
触发器的类型:
insert 触发器;
delete 触发器;
update 触发器:在修改表中记录行或某列数据时触发执行;
注意:update(列)函数:实现检测某列是否被修改。
update 更新操作分为两步:
首先,“删除”更改前原有数据行:删除的原有数据行将复制到deleted临时表中;
然后,“插入”更改后的新数据行:插入新数据行到原始表,同时将新数据行保存到inserted临时表和触发器表中;
创建触发器的注意点:
1、create trigger必须是批处理(go)的第一条语句;
2、一个触发器语句只能用到一个表或一个视图中;
on 表名/ 视图名
3、一个触发器语句可以执行多个操作;
for delete,insert,update -- 无先后顺序的任意组合
4、建议DML触发器不返回任何结果。这是因为对这些返回结果的特殊处理必须写入每个允许对触发器表进行修改的应用程序中。
若要防止从 DML 触发器返回任何结果,请不要在触发器定义中包含select语句或变量赋值;
如果必须在触发器中进行变量赋值,则应该在触发器被触发之前使用set nocount on语句以避免返回任何结果集;
5、如果“触发器表”本身也存在约束,则在执行insert、delete、update触发器前,首先会检查“触发器表”上存在的约束。如果不满足约束,则不会执行其insert、delete、update触发器。
例题:
表Class:

表ClassBak:

-- 1在每次插入数据的时候都把插入的数据值打印出来。
--inserted表,after。
use MySchool
select * from Class
create trigger tri_Class_after
on Class after insert
as
begin
declare @cId int
declare @cName varchar(50)
declare @cDesc varchar(50)
select @cId=clsId,@cName=cName,@cDesc=cDescription
from inserted
print @cId
print @cName
print @cDesc
end
insert into Class values('java','嘿嘿')
---------------------------------------------------------
-- 2将删除的表中(Class)的数据备份到另外一个表中(ClassBak)
-- --(1)建一个空表(ClassBak)与Class的结构一样。
select top 0 * into ClassBak
from Class
select * from ClassBak
-- --(2)创建触发器
create trigger tri_Class_Delete_after
on Class after delete
as
begin
set identity_insert ClassBak on
insert into ClassBak(clsId,cName,cDescription)
select * from deleted
set identity_insert ClassBak off
end
delete from Class where clsId=9
select * from Class
------------------------------------------
-- 3--替换触发器(instead of)--替换删除操作
drop trigger tri_Class_Delete_after2
create trigger tri_Class_Delete_instead_of
on Class instead of delete
as
begin
set identity_insert ClassBak on
insert into ClassBak(clsId,cName,cDescription)
select * from deleted
set identity_insert ClassBak off
end
delete from ClassBak
select * from Class
select * from ClassBak
delete from Class where clsId=11