递归触发器引起的异常,请教!!

windoncloud 2004-11-25 11:29:29
我的SQL文件:(如下)


USE master
go

create database DEPTLISTS
ON
(NAME=DEPTLISTS_DAT,
FILENAME='F:\My Files\vb\P237\DEPTLISTS_DAT.MDF')
LOG ON
(NAME=DEPTLISTS_LOG,
FILENAME='F:\My Files\vb\P237\DEPTLISTS_LOG.LDF')
GO

use DEPTLISTS
go

CREATE TABLE DEPTL
(lngDeptID INT,lngFatherID INT,strDeptName char(10))
go

begin tran
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(1,0,'北京部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(2,0,'上海部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(3,0,'广州部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(4,1,'海淀分部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(5,1,'朝阳分部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(6,1,'西城分部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(7,2,'静安分部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(8,2,'黄埔分部')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(9,4,'知春路部门')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(10,4,'北外分部门')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(11,3,'a')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(12,11,'b')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(13,12,'c')
insert into DEPTL(lngDeptID,lngFatherID,strDeptName) values(14,13,'d')
go
commit tran

select * from DEPTL
go

CREATE TRIGGER mydel ON [dbo].[DEPTL]
FOR DELETE
AS
delete from deptl where lngFatherid=(select lngdeptid from deleted)
go

delete from deptl where strDeptName='a'
go

我创建了一个数据库,添加了一些数据。我想实现递归的删除。比如删除strDeptName='a'的一条数据的时候,由触发器触发删除其它数据中lngFatherid与所删除一条数据中lngDeptid 相等的一条数据。在数据库我用了递归触发器。希望级连删除strDeptName='b' ,strDeptName='c' ,strDeptName='d'这几条数据。

结果报错:

服务器: 消息 217,级别 16,状态 1,过程 mydel,行 6
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。

为什么会报这个错呢?请教,多谢!
...全文
189 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
windoncloud 2004-11-27
  • 打赏
  • 举报
回复
UP!
windoncloud 2004-11-27
  • 打赏
  • 举报
回复
受到您(zjcxc(邹建))的启发,我用递归触发器实现了级连删除。仅仅多了一个条件: 
  if @@rowcount>0

触发器代码改成:

CREATE TRIGGER mydel ON [dbo].[DEPTL]
for DELETE
AS
if @@rowcount>0 --加上这个条件,递归就不会超过32层了,否则是个无限循环!!
delete from deptl where lngFatherid=(select lngdeptid from deleted)

不过,正象您所说的:“不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况”
只是可以依次递增的情况。
windoncloud 2004-11-26
  • 打赏
  • 举报
回复
多谢指点!按您写的触发器实现了功能。再次感谢!!
只是想再请教一下递归触发器的一些用法问题,在联机帮助中也没有详细说明递归触发器如何用,为什么我用递归触发器,只是级连了删除了四个记录,报错说是“删除数据的递归关系已经超过了32层”呢?能不能帮我分析一下这个错误产生的过程呢?谢谢!
另有没有递归触发器的资料?多谢了!我会继续加分。。。。
zjcxc 2004-11-26
  • 打赏
  • 举报
回复
--楼主可以这样写触发器(不用递归)

CREATE TRIGGER mydel ON [dbo].[DEPTL]
FOR DELETE
AS
select a.lngdeptid into #t from [dbo].[DEPTL] a,deleted d
where a.lngFatherid=d.lngdeptid
while @@rowcount>0
insert #t select a.lngdeptid from [dbo].[DEPTL] a,#t d
where a.lngFatherid=d.lngdeptid and not exists(
select * from #t where lngdeptid=a.lngdeptid)
delete a from deptl a,#t d where a.lngdeptid=d.lngdeptid
go
goodboycwy 2004-11-26
  • 打赏
  • 举报
回复
看来还真的要多学习了
zjcxc 2004-11-26
  • 打赏
  • 举报
回复
1.错误提示已经很清楚了,触发器的确递归的最大层数是32层,而你的数据中,要删除数据的递归关系已经超过了32层

2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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