SQL Server触发器

来源:互联网 发布:mac的ae插件怎么安装 编辑:程序博客网 时间:2024/06/05 05:48

地址:http://blog.csdn.net/zuozuo1245/article/details/9067437#t0

概念:

  触发器是一种特殊的存储过程,不同于普通的存储过程。存储过程可以用存储过程名直接被调用,而触发器是通过事件的触发而被执行。

  类型:

  insert触发器:在表进行插入操作时触发。

  update触发器:在表进行更新操作时触发。

  Delete触发器:在表进行删除操作时触发。

  after触发器:在一个触发动作之后激发,并提供一种一种机制以控制多个触发器的执行顺序。

  instead of触发器:不执行插入、更新或者删除操作,用instead  of触发器的SQL语句代替那些操作。

  例子:

  新闻发布系统中有新闻类别表、新闻表和评论表,新闻类别表的主键是新闻表的外键,新闻表的主键时评论表的外键。要删除某一新闻类别时因为建立了外键约束不能直接删除新闻类别,这时可以有三种解决办法。

  一是:在建立外键约束时,在INSERT和UPDATE规范下面的删除规则里选择“级联”选项。(详见我的博客:sql server2008如何创建外键)

  二是:用存储过程。写一个存储过程,里面包含三个删除操作,首先删除评论表里的内容,接着删除新闻表里的内容,最后才是删除新闻类别表中的内容。

  SQL语句是:

[sql] view plaincopyprint?
  1. CREATE PROCEDURE [dbo].[PROC_DeleteCategory]  
  2.  @caId int  
  3. AS  
  4. BEGIN  
  5.       
  6.     --删除评论  
  7.     delete from comment where newsId inselect id from  news where caId =@caId )  
  8.     --删除新闻  
  9.     delete news where caId =@caId   
  10.     --删除类别  
  11.     delete category where id =@caId   
  12.   
  13. END  

 

  三是:用触发器。这里要用instead of触发器,因为after触发器是要操作之后,这里因为有外键约束不能执行删除类别操作 。所以要用instead of触发器,他不执行sql语句的删除类别操作,他执行instead of触发器。

  SQL语句是:

[sql] view plaincopyprint?
  1. -- =============================================  
  2. -- Author:      左华蓉  
  3. -- Create date: 2013.6.9  
  4. -- Description: 删除类别触发器  
  5. -- =============================================  
  6. CREATE TRIGGER [dbo].[trigCategoryDelete]  
  7.    ON  [dbo].[category]   
  8.    instead of DELETE  
  9. AS   
  10. BEGIN  
  11. declare @caId int   
  12. select @caId = id from deleted   
  13. --删除评论  
  14. delete comment where newsId in(select newsId from news where caId=@caId)  
  15. --删除新闻  
  16. delete news where caId =@caId   
  17. --删除类别  
  18. delete category where id =@caId   
  19.   
  20.       
  21. END  

 

  比较:

  第一种方法最为简单,但是局限性也很大,只能是一些简单的删除更新操作,如果我要插入一个新闻类别,但是不允许类别名中含有某个关键字,则他就无能为力了。触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须是用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。触发器可以用来强制实施复杂的业务规则,以确保数据的完整性。