先了解一下触发器:
触发器其实就是一个特殊的存储过程,因为它和存储过程有一样的特征,都是预用写好的Sql命令存储在SqlServer服务器中。触发器在指定的表中的数据发生变化的时候会自动执
行。它与存储过程的区别也在此,因为存储过程是需要我们用命令去调用的。
在Sql Server2005之前,是没有DDL触发器的,我们要知道,DDL触发器是Sql Server2005新增的触发器。
DML触发器:当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业
务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
一个简单的例子,我们想要在送货后减少库存的数量,那我们就可以在送货单的表上写update触发器,用来减少库存的数量。
DDL触发器:它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时
执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。
DML触发器详细说明:
前面有说了DML触发器与DML触发器的定义及一些基本作用。现在我们来详细了解一下我们用的最多的DML触发器。
DML触发器在执行顺序上我们又可以将它分为两类,一是在insert,update,delete语句执行后触发的触发器,也就是after触发器,该类触发器是我们用的最多的。可能我们在网上一些示例中看到有用for定义的触发器,基实用after定义与for定义都一样,只是for是Sql Server早期版本唯一可使用的选项,编辑现在已经不用了。
注意:after触发器只能在表上指定,且在该类触发器中不允许使用text,ntext,image列。
简单示例:
create trigger ti_tb1 after insert
as
if @@rowcount=0 return;
set nocount on
--具体触发器内容
set nocounf off
第二类是在insert,update,delete语句执行前触发的触发器,也就是instead of触发器,这类触发器可能定义在一个或多个基表上的视图上。
注意:同一表同一个执行类型,只能创建一个instead of触发器,也就是说一个表只能一个插入前触发器,一个修改前触发器,一个删除前触发器,而after则不限制数量,在该触发器中可以使用text,ntext,image列。
特别重要:在instead of触发器中会中断insert,update,delete操作。也就是说,如果你想要在某表执行完instead of insert触发器后继续执行插入动作,你必须在instead of insert触发器中再写一次插入语句.
简单示例:
create trigger ti_tb1 instead of insert
as
if @@rowcount=0 return;
set nocount on
--具体触发器内容
--该触发器会中断insert命令,如果你想在执行完该触发器后继续执行插入命令,你必须再写一次插入语句,如
--insert tb1(col1,col2)
--select col1,col2 from inserted
set nocounf off
以上代码为编辑在记事本中写的,未在查询分析器中验证,可能会存在关键字写错的情况,请读者自己调整。