2016-08-30 10 views
1

に私は、二つのテーブルtable1table2を持って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 

スタンドアローンのコマンドの下に実行し、それはまた table2parent_id=2すべての子を更新しますが、それは単に とき部分の下に、と言って geo_id=2 のチャイルズに対する table1を更新しない geo_id=2 ため table1を更新しますトリガーと呼ばれるトリガー

update table2 
set anyCol=AnyValue // suppose setting any column 
where [email protected] 

それは同じテーブル内の子レコードの束を更新しますが、子レコードは更新されませんグラムtable1

+0

TRIGGER [DBO]を設定するまで再帰的ではないだろう。[updateGeoHierarchyChilds] [DBO]にトリガ。[表2]私は考えますか? – Serg

+0

ここにカーソルは必要ありません。これは、2つの単純な更新ステートメントに変わり、カーソルを完全に忘れてしまいます。トリガーは再帰的に実行されません。これらの更新は、コード内で行う必要があります。 –

+0

https://technet.microsoft.com/en-us/library/ms191520(v=sql.105).aspx –

答えて

0

でthier関係レコードあなたはオプション

ALTER DATABASE [you db] SET RECURSIVE_TRIGGERS ON WITH NO_WAIT 
GO 
+0

それは何か新しいことをした、それは正しいことを行うことを確認する –

+0

ありがとう、 –