用触发器进行级联删除

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 03:57 点击:

这次遇到的问题是表的级联删除,当删除一个主键信息时会出错,因为还有外键信息,要想全部删除就用到了触发器。
 
<span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">CREATE TRIGGER trigCategoryDelete (创建触发器) 
   ON  Category (在哪个表上创建) 
   after DELETE  (引发触发器的事件) 
AS  
BEGIN 
    delete news where caID=(select id from deleted)(触发器引发后的一些处理语句) 
END 
</span> 

但是after是在delete发生之后的,所以这样还是会报错。删除操作都已经结束了还怎么删除外键呢。
instead of 代替删除语句:
 
<span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">ALTER TRIGGER [dbo].[trigCategoryDelete]  
   ON  [dbo].[category]  
   instead of  DELETE 
AS  
BEGIN 
    declare @id int 
    select @id=id from deleted  
    --删除新闻 
    delete news where caId=@id 
    --删除新闻类别 
    delete category where id=@id  
END</span> 
这样就能删除外键里的信息了。
如果是三个表的级联删除
 
<span style="font-family:Microsoft YaHei;font-size:16px;color:#6600cc;">ALTER TRIGGER [dbo].[trigCategoryDelete]  
   ON  [dbo].[category]  
   instead of  DELETE 
AS  
BEGIN 
    declare @caId int 
    select @caId=id from deleted  
    --删除评论 
    delete comment where newsId = (select id from news where caId=@caId) 
    --删除新闻 
    delete news where caId=@caId 
    --删除新闻类别 
    delete category where id=@caId  
END</span> 

 
但是这样的话会报错,错就错在一条新闻下对应着多条评论,解决办法就是把“=”改为“in”,这样所有查处的评论都可以删除了
ps:至于前面出发器的名称和表的名称不太一样,相信大部分人都知道,当保存触发器后,再打开的时候就会自动补全表信息。

作者:lixueru0819

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • 浅析.NET下XML数据访问新机制
      • asp.net 面试+笔试题目第1/2页
      • C# 邮件地址是否合法的验证
      • asp.net 设置GridView的选中行的实现代码
      • C#高级编程:数据库连接[1]
      • 经典C++程序1
      • IIS 自动回收导致后台定时器失效的问题解决
      • ASP.NET&#160;GridView列表代码示例
      • Asp.net MVC源码分析--Action Filter的链式调用
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1