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)。
为什么会报这个错呢?请教,多谢!
6 个解决方案
#1
1.错误提示已经很清楚了,触发器的确递归的最大层数是32层,而你的数据中,要删除数据的递归关系已经超过了32层
2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况
2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况
#2
看来还真的要多学习了
#3
--楼主可以这样写触发器(不用递归)
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
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
#4
多谢指点!按您写的触发器实现了功能。再次感谢!!
只是想再请教一下递归触发器的一些用法问题,在联机帮助中也没有详细说明递归触发器如何用,为什么我用递归触发器,只是级连了删除了四个记录,报错说是“删除数据的递归关系已经超过了32层”呢?能不能帮我分析一下这个错误产生的过程呢?谢谢!
另有没有递归触发器的资料?多谢了!我会继续加分。。。。
只是想再请教一下递归触发器的一些用法问题,在联机帮助中也没有详细说明递归触发器如何用,为什么我用递归触发器,只是级连了删除了四个记录,报错说是“删除数据的递归关系已经超过了32层”呢?能不能帮我分析一下这个错误产生的过程呢?谢谢!
另有没有递归触发器的资料?多谢了!我会继续加分。。。。
#5
受到您(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)
不过,正象您所说的:“不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况”
只是可以依次递增的情况。
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)
不过,正象您所说的:“不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况”
只是可以依次递增的情况。
#6
UP!
#1
1.错误提示已经很清楚了,触发器的确递归的最大层数是32层,而你的数据中,要删除数据的递归关系已经超过了32层
2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况
2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况
#2
看来还真的要多学习了
#3
--楼主可以这样写触发器(不用递归)
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
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
#4
多谢指点!按您写的触发器实现了功能。再次感谢!!
只是想再请教一下递归触发器的一些用法问题,在联机帮助中也没有详细说明递归触发器如何用,为什么我用递归触发器,只是级连了删除了四个记录,报错说是“删除数据的递归关系已经超过了32层”呢?能不能帮我分析一下这个错误产生的过程呢?谢谢!
另有没有递归触发器的资料?多谢了!我会继续加分。。。。
只是想再请教一下递归触发器的一些用法问题,在联机帮助中也没有详细说明递归触发器如何用,为什么我用递归触发器,只是级连了删除了四个记录,报错说是“删除数据的递归关系已经超过了32层”呢?能不能帮我分析一下这个错误产生的过程呢?谢谢!
另有没有递归触发器的资料?多谢了!我会继续加分。。。。
#5
受到您(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)
不过,正象您所说的:“不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况”
只是可以依次递增的情况。
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)
不过,正象您所说的:“不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况”
只是可以依次递增的情况。
#6
UP!