请帮忙解决一下SQL SERVER触发器的问题

上将军
博客专家认证
2000-11-23 04:44:00
我有一个表,表里的数据有以下结构:
第一层
┖第二层
┖第三层
┖第四层
┖第五层
┖……
当我删除其中一层的时候,我想把,它下面的层在触发器中全部删除。我写的触发器只能删除两层,例如我选择删除第二层,触发器只帮我删除了第三层,第四层以下的层渡没帮我删除,请问各位大虾,要实现这,触发器应该怎么写?
我触发器的写法是:从DELETED中选择已经删除的记录的唯一ID,然后通过记录中一个记录父记录的字段与选择出来的唯一ID对应删除下一层。



...全文
191 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nononono 2000-11-24
  • 打赏
  • 举报
回复
给你一个非递归算法(第3次贴这个存储过程了),你自己加上事务吧。

删除一个指定父类的算法:

CREATE procedure [delb] (@delclass char(10)) as

create table [#tmptable] (父類 char(10),子類 char(10))

declare @n int, @foundfclass char(10), @foundsclass char(10)

select @foundfclass=@delclass
select @n=1

while @n>0
begin
insert into [#tmptable]
select 父類,子類 from [tttt] where 父類=@foundfclass

delete from [tttt] where 父類=@foundfclass

select top 1 @foundsclass=父類, @foundfclass=子類 from [#tmptable]

delete from [#tmptable] where 父類=@foundsclass and 子類=@foundfclass

select @n=count(*) from [#tmptable]
end

drop table [#tmptable]

return
pjy 2000-11-23
  • 打赏
  • 举报
回复
在触发器中首先将删除的ID得到,将此ID赋给一个变量,
如果你的记录是每个记录只有一个下级的话,然后进行循环,查找父ID等于此变量的记录,将对应ID存于临时表中,并将此ID赋给先前的变量,然后删除所有ID存在与临时表中的记录。
如果一个记录有多条记录,则临时表中加一个字段,表示是否进行了分解,对于新加于临时表的记录赋此值为'0',对此临时表需要使用一个游标,反复分解没有分解的记录,分解得到的ID仍存在此临时表中,可得到你所需要的结果,最后在删除所有ID存在与临时表中的记录。

另外你可以考虑一下递归存储过程的使用方法,则你的程序就不需要编的如此麻烦!
上将军 2000-11-23
  • 打赏
  • 举报
回复
我试过了,还是不行,不知道是什么原因
表(A)结构是:id,pid,desc1
declare @RowCount int
select ID
into #RequestDelete
from Deleted
select @RowCount=@@Rowcount
while (@RowCount>1)
begin
insert #RequestDelete (ID)
select ID
From A
where pID=id and ID not in (select ID
from #RequestDelete)
select @RowCount==@@Rowcount
end
delete A from A,#RequestDelete
where A.ID=#RequestDelete.ID

tanghuan 2000-11-23
  • 打赏
  • 举报
回复
你不能这样
触发器不能自己触发自己
比如:删除 A 表的记录 a 触发 删除触发器又删除 A 表的记录b,删除记录b时就不会再触发 删除触发器来删除记录c了

你可以用下面的方法完成

declare @RowCount int
select ID
into #RequestDelete
from Deleted
select @RowCount=@@Rowcount
while (@RowCount>1)
begin
insert #RequestDelete (ID)
select ID
From A
where ID 是删除 #RequestDelete中ID时需要删除的
and ID not in (select ID
from #RequestDelete)
select @RowCount==@@Rowcount
end
delete A from A,#RequestDelete
where A.ID=#RequestDelete.ID

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧