在自联接的表中,如何实现级联删除?触发器+存储过程?(100分)

  • 主题发起人 主题发起人 cxjlike
  • 开始时间 开始时间
C

cxjlike

Unregistered / Unconfirmed
GUEST, unregistred user!
在自联接的表中,如何实现级联删除?触发器+存储过程?

为了实现无限层树形关系记录,在SQL2000用了自联接表b1:

id upid theLevel theName
1 null 1 a1
2 1 2 a2
3 2 3 a3
4 3 4 a4
....

以上数据如果表现为树形即:

a1 根节点
a2 子节点
a3 子节点....
a4
...

表中,id为主键,upid为外键,theLevel为树的层次 。其中,外键upid与当前表自己的主键id对应。即表b1 实现了自己与自己的一对多关系。

现在想实现级联删除。(先把 所有upid=当前记录.id 的记录,称为当前记录的子记录。如:第一行a1的id=1,第二行a2的upid=1,即a2为a1的子记录)

即:删除 a1时,a1的子记录a2被删除,a2的子记录a3被删除... 这样将这一分支删除完。

这一功能在Access2000中,只需定义表的自联接关系,并将属性设为‘级联删除’即可。但是在sql2000中,自联接表的'级联删除'属性不可用。那在sql2000中应该如何实现上此功能呢?

我试着用触发器:
CREATE TRIGGER b1_tr1 ON [dbo].[b1]
FOR DELETE
AS
declare @Aid int

select @Aid=id from deleted

delete from b1 where upid=@Aid

但是触发器只触发了一次。即,删除a1时,仅a2被删除。但触发器自动删除a2时,(语句delete from mb_DAgroup1 where upid=@Aid)并没有实现再次触发而自动删除a3...

请问:
1.在SQL2000中能不能象Access2000那样,用‘关系’的‘级联删除’属性实现级联删除?如果能,怎样实现?
2.如果不能,用触发器应怎样实现?(或存储过程)



 
SQL2000中能实现级联删除.
选择一个表,右键选择设计表,打开设计表界面.然后点击关系图标,就可以进行级联删除和级联修改的选择了.

你的触发器没有死循环,[:)]你在DELETE事件中触发DELETE
 
to sunni_liu
我知道在SQL2000中可以实现级联删除。但我的表是自联接表,即当前表与它自己产生了一对多关系。在Access中自联接表也可以实现级联删除。但是在SQL2000中我作不到(它的级联删除复选框是灰的)。请问你能在SQL2000中实现自联接表的级联删除吗?
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部