触发器使用
触发器是一种特殊的存储过程,她不能被显示的调用,而是在对表增删改操作后被激活。所以可以用触发器对来实施复杂的完整性约束。
SQL为每个触发器创建两个专用表:Inserted表和Deleted表。这两张表由系统来维护,她们存在内存中而不是在数据库中,触发完成后,相关的两个表也会被删除。
AFTER 触发器和INSTEAD OF 触发器
SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。
触发器的执行过程
如果一个insert,update或delete语句违反了约束,那么after触发器不会被执行,因为对约束的检查是在after触发器执行之前发生的,所以after不能超越约束。
instead of触发器可以取代激发她的操作来执行,她在inserted表和deleted 表刚被建立,其他操作还未发生时执行,因为inserted of 在约束检查前执行,所以可以对约束进行一些预处理。
创建触发器语法
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
--你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。
实例:
1 create trigger tri_creatproject 2 on dbo.ProjectRegister 3 for insert /*插入触发*/ 4 as 5 declare @ID int ,@Name varchar(20),@type tinyint; /* 变量定义*/ 6 select @ID = ID from inserted; /* 得到插入的数据ID*/ 7 /* 相关变量赋值*/ 8 set @ID = @ID + '40001' 9 set @Name = '项目部'; 10 set @type = 1; 11 insert into Supplier(ID,Name,[type]) values(@ID,@Name,@type); /*触发后插入另一张表*/ 12 go
删除触发器
drop trigger trigger_name
查看已有触发器
select * from sysobjects where xtype = 'tr'
查看一个触发器
exec sp_helptext 'trigger_name'