に私は、二つのテーブルtable1
とtable2
を持ってtable2
は再帰トリガーは、SQL Server 2008の
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 [email protected]
update table2
set anyCol=AnyValue // suppose setting any column
where [email protected]
FETCH NEXT FROM VicIds INTO @ID
END
CLOSE VicIds
DEALLOCATE VicIds
END
私がタブレットを更新すると例えばE2は、私が
update table2
set anyCol=anyValue //this line is supposition for sake of example
where geo_id=2
スタンドアローンのコマンドの下に実行し、それはまた
table2
で
parent_id=2
すべての子を更新しますが、それは単に とき部分の下に、と言って
geo_id=2
のチャイルズに対する
table1
を更新しない
geo_id=2
ため
table1
を更新しますトリガーと呼ばれるトリガー
update table2
set anyCol=AnyValue // suppose setting any column
where [email protected]
それは同じテーブル内の子レコードの束を更新しますが、子レコードは更新されませんグラムtable1
TRIGGER [DBO]を設定するまで再帰的ではないだろう。[updateGeoHierarchyChilds] [DBO]にトリガ。[表2]私は考えますか? – Serg
ここにカーソルは必要ありません。これは、2つの単純な更新ステートメントに変わり、カーソルを完全に忘れてしまいます。トリガーは再帰的に実行されません。これらの更新は、コード内で行う必要があります。 –
https://technet.microsoft.com/en-us/library/ms191520(v=sql.105).aspx –