SQL Server 2008 中的递归触发器
Recursive Triggers in SQL Server 2008
我有两个 table table1
和 table2
,table2
有如下层级数据
geo_id parent_id
1 NULL
2 1
3 2
4 3
5 3
6 3
和table1有如下数据
ID geo_id
1 2
2 3
3 3
4 3
5 5
6 5
终于有了下面的更新触发器,
USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[updateGeoHierarchyChilds] ON [dbo].[table2]
FOR UPDATE
AS
declare @ID int
BEGIN
Declare VicIds CURSOR LOCAL FOR SELECT geo_id from inserted
OPEN VicIds
FETCH NEXT FROM VicIds into @ID
WHILE @@FETCH_STATUS=0
BEGIN
update table1
set anyCol=AnyValue // suppose setting any column
where geo_id=@ID
update table2
set anyCol=AnyValue // suppose setting any column
where parent_id=@ID
FETCH NEXT FROM VicIds INTO @ID
END
CLOSE VicIds
DEALLOCATE VicIds
END
例如,当我更新 table2 时,我 运行 下面的命令独立
update table2
set anyCol=anyValue //this line is supposition for sake of example
where geo_id=2
它为 geo_id=2
更新 table1
它还会更新所有 child where parent_id=2
in table2
但它没有根据 geo_id=2
的 child 更新 table1
简单地说,
当下面的触发器部分被调用时
update table2
set anyCol=AnyValue // suppose setting any column
where parent_id=@ID
它更新了同一个 table 中的一堆 child 记录,但是 child 记录没有更新它们在 table1
中的关系记录
在您设置选项之前,您的触发器不会递归
ALTER DATABASE [you db] SET RECURSIVE_TRIGGERS ON WITH NO_WAIT
GO
我有两个 table table1
和 table2
,table2
有如下层级数据
geo_id parent_id
1 NULL
2 1
3 2
4 3
5 3
6 3
和table1有如下数据
ID geo_id
1 2
2 3
3 3
4 3
5 5
6 5
终于有了下面的更新触发器,
USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[updateGeoHierarchyChilds] ON [dbo].[table2]
FOR UPDATE
AS
declare @ID int
BEGIN
Declare VicIds CURSOR LOCAL FOR SELECT geo_id from inserted
OPEN VicIds
FETCH NEXT FROM VicIds into @ID
WHILE @@FETCH_STATUS=0
BEGIN
update table1
set anyCol=AnyValue // suppose setting any column
where geo_id=@ID
update table2
set anyCol=AnyValue // suppose setting any column
where parent_id=@ID
FETCH NEXT FROM VicIds INTO @ID
END
CLOSE VicIds
DEALLOCATE VicIds
END
例如,当我更新 table2 时,我 运行 下面的命令独立
update table2
set anyCol=anyValue //this line is supposition for sake of example
where geo_id=2
它为 geo_id=2
更新 table1
它还会更新所有 child where parent_id=2
in table2
但它没有根据 geo_id=2
的 child 更新 table1
简单地说,
当下面的触发器部分被调用时
update table2
set anyCol=AnyValue // suppose setting any column
where parent_id=@ID
它更新了同一个 table 中的一堆 child 记录,但是 child 记录没有更新它们在 table1
在您设置选项之前,您的触发器不会递归
ALTER DATABASE [you db] SET RECURSIVE_TRIGGERS ON WITH NO_WAIT
GO