2017-09-19 3 views
1

私はそれが2つのトリガ(for update)を持つtableを持っているのSQL Serverに2014アクションが他のトリガSQL SERVERによって行われたかどうかを検出しますか?

を使用しています。

トリガー1 - 更新列A。 (これによりトリガー2が呼び出される)

トリガー2 - 更新列B。現在の更新がトリガを介してトリガされたことを識別することが可能である - トリガー内

質問(これはトリガ1が起動されるようにしますか)?

例:

1-ユーザ更新テーブル
2-トリガ1更新カラム
3 -trigger 2ステップによる起動
4 2 - トリガー2内 - 任意のコードが存在することstep2でトリガによって更新が行われたことを検出できますか?

+0

テーブルにフィールドを追加し、トリガー1にそれを更新トリガー2よりもそのフィールドを読み取ることができ – GuidoG

+0

が周りニースの仕事を@GuidoG - しかし、表示を追加しますすべてのテーブル(〜500)の列​​は問題があるようです。:-) –

+0

列Aはトリガ1によってのみ更新されますか?そうであれば、挿入されていればトリガー2をチェックインできます.Aはdeleted.Aとは異なります。 – GuidoG

答えて

1

CONTEXT_INFO()を試しましたか?

ALTER TRIGGER test1 
    ON table 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT UPDATE(x) 
     RETURN; 

    DECLARE @ci varbinary(128) = CAST('Trigger=' + cast(OBJECT_NAME(@@PROCID) AS varchar(128)) + REPLICATE(' ', 128) as varbinary(128)); 
    SET CONTEXT_INFO @ci; 

    UPDATE table 
     SET a = 1 
     WHERE id = 1; 

    SET CONTEXT_INFO 0x0; -- clear 
END 
GO 

alter TRIGGER test2 
    ON table 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF NOT UPDATE(a) 
     RETURN; 

    DECLARE @ci varchar(128) = (SELECT CAST(CONTEXT_INFO() AS varchar) FROM master.dbo.SYSPROCESSES WHERE spid = @@SPID); 
    DECLARE @log varchar(2048) = CONCAT('CALLER:', @ci); 
    EXEC xp_logevent 60000, @log, informational; 

    -- update b 
END 
GO 

これは、メッセージログ私を与える:

Date  19.09.2017 18:31:21 
Log  SQL Server (Current - 19.09.2017 18:29:00) 

Source  spid74 

Message 
CALLER:Trigger=test1 
+0

UPDATE(c)とは何ですか? –

+0

'UPDATE(c)'列 'c'が更新された場合は' true'を返します。 p.s.最後に編集をチェックしてください - 私は1つの必要な 'cast'を追加しました –

+0

これは2の前に1が実行される場合にのみ有効です –

関連する問題