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)。
1.错误提示已经很清楚了,触发器的确递归的最大层数是32层,而你的数据中,要删除数据的递归关系已经超过了32层
2.楼主的触发器不能处理一次删除多条记录的情况,也不能处理一个父包含多个子的情况
--楼主可以这样写触发器(不用递归)
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