这是SQLServer基础知识方面的一片文章,msdn中有关触发器的介绍文章
<<了解 DML 触发器>>
http://msdn.microsoft.com/zh-cn/library/ms178110.aspx
其中有一段描述
DML 触发器在以下方面非常有用:
- DML 触发器可通过数据库中的相关表实现级联更改。不过,通过级联引用完整性约束可以更有效地进行这些更改。
- DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。
与 CHECK 约束不同,DML 触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。 - DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。
- 一个表中的多个同类 DML 触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的操作来响应同一个修改语句。
对 于初学者往往会滥用触发器导致数据库管理混乱,触发器是把双刃剑,慎用.从上面的描述可以看出来,ms还是倾向于在用普通约束或其他sql本身无法解决的 时候才推荐使用触发器.我个人认为在类似他列举的1和3这两条,在具备条件的情况下应该也少用触发器,而是在程序中通过事务控制实现.
这里也不再讨论滥用的这个问题,而是对以上ms推荐的四种场景来举例讨论具体应用情况.
1.第一个场景主要是说明某表数据变动,其他依赖表项能同步反映.下面测试语句可以直接运行.
/******************************************
DML 触发器可通过数据库中的相关表实现级联更改
*******************************************/
--测试用例:同步张同构表
--创建测试表
create table a(id int ,name varchar(10))
create table b(id int ,name varchar(10))
go
--建立触发器
create trigger trg_test
on a
for insert,update,delete
as
begin
if exists (select 1 from deleted)
delete from b where id in(select id