触发器使用

  触发器是一种特殊的存储过程,她不能被显示的调用,而是在对表增删改操作后被激活。所以可以用触发器对来实施复杂的完整性约束。

  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'
posted @ 2012-08-22 11:13  诸葛风流  阅读(1423)  评论(1编辑  收藏  举报