CSDN博客

img zerolsy

instead of触发器

发表于2008/9/28 11:51:00  2872人阅读

INSTEAD OF触发器

   可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。INSTEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERTUPDATE DELETE),每一个表或视图只能有一个INSTEAD OF触发器。

   INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。

   不能在带有WITH CHECK OPTION定义的视图中创建INSTEAD OF触发器。

 

INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。基于多个基表的视图必须使用    

      INSTEAD OF 触发器来支持引用多个表中数据的插入、更新和删除操作。INSTEAD OF 触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。

      Transact-SQL 语句创建两个基表、一个视图和视图上的 INSTEAD OF 触发器。以下表将个人数据和业务数据分开并且是视图的基表。

  1. /*在视图上定义 instead of insert 触发器以在一个或多个基表中插入数据。*/
  2. --部门表
  3. create table dept
  4. (
  5.     d_id int primary key,
  6.     d_name varchar(20)
  7. )
  8. --员工表
  9. create table emp
  10. (
  11.    e_id int primary key,
  12.    e_name varchar(20),
  13.    d_id int references dept(d_id)
  14. )
  15. if exists(select * from sysobjects where name='v')
  16. drop view v
  17. go
  18. create view v 
  19. as 
  20.     select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id 
  21. go
  22. /*******************使用instead of 触发器******************/
  23. if exists(select * from sysobjects where name='de_em_insert')
  24. drop trigger de_em_insert
  25. go
  26. create trigger de_em_insert
  27. on v
  28. instead of insert
  29. as
  30. begin
  31.     if (not exists (select d.d_id from dept d, inserted i where d.d_id = i.d_id))
  32.      insert into dept select d_id,d_name from inserted
  33.    if (not exists (select e.d_id from emp e, inserted i where e.d_id = i.d_id))
  34.    insert into emp select e_id,e_name,d_id from inserted
  35. else
  36.    update emp set e_id = i.e_id,e_name = i.e_name from emp e, inserted i where e.d_id = i.d_id
  37. end
  38. select * from v
  39. insert into v values(1001,'张珊',101,'销售部')
  40. select * from v
  41. select * from emp
  42. select * from dept

 可以在视图或表中定义 INSTEAD OF DELETE 触发器,以代替 DELETE 语句的标准操作。通常,在视图上定义 INSTEAD OF DELETE 触发器以便在一个或多个基表中修改数据。  
      可在视图上定义 INSTEAD OF UPDATE 触发器以代替 UPDATE 语句的标准操作。通常,在视图上定义 INSTEAD OF UPDATE 触发器以便修改一个或多个基表中的数据。

 

 

阅读全文
0 0

相关文章推荐

img
取 消
img