用触发器进行级联删除

原文:http://blog.csdn.net/lixueru0819/article/details/6841572

这次遇到的问题是表的级联删除,当删除一个主键信息时会出错,因为还有外键信息,要想全部删除就用到了触发器。

  1. <span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">CREATE TRIGGER trigCategoryDelete (创建触发器)  
  2.    ON  Category (在哪个表上创建)  
  3.    after DELETE  (引发触发器的事件)  
  4. AS   
  5. BEGIN  
  6.     delete news where caID=(select id from deleted)(触发器引发后的一些处理语句)  
  7. END  
  8. </span>  


但是after是在delete发生之后的,所以这样还是会报错。删除操作都已经结束了还怎么删除外键呢。

instead of 代替删除语句:

  1. <span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">ALTER TRIGGER [dbo].[trigCategoryDelete]   
  2.    ON  [dbo].[category]   
  3.    instead of  DELETE  
  4. AS   
  5. BEGIN  
  6.     declare @id int  
  7.     select @id=id from deleted   
  8.     --删除新闻  
  9.     delete news where caId=@id  
  10.     --删除新闻类别  
  11.     delete category where id=@id   
  12. END</span>  

这样就能删除外键里的信息了。

如果是三个表的级联删除

  1. <span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">ALTER TRIGGER [dbo].[trigCategoryDelete]   
  2.    ON  [dbo].[category]   
  3.    instead of  DELETE  
  4. AS   
  5. BEGIN  
  6.     declare @caId int  
  7.     select @caId=id from deleted   
  8.     --删除评论  
  9.     delete comment where newsId = (select id from news where caId=@caId)  
  10.     --删除新闻  
  11.     delete news where caId=@caId  
  12.     --删除新闻类别  
  13.     delete category where id=@caId   
  14. END</span>  


 

但是这样的话会报错,错就错在一条新闻下对应着多条评论,解决办法就是把“=”改为“in”,这样所有查处的评论都可以删除了

ps:至于前面出发器的名称和表的名称不太一样,相信大部分人都知道,当保存触发器后,再打开的时候就会自动补全表信息。

posted @ 2013-10-18 18:43  做一个GENTALMAN  阅读(1146)  评论(0编辑  收藏  举报