9

重複
の可能性: トリガーは、データを変更したストアド プロシージャの名前を見つけることができますか?

トリガー(更新時)を持つテーブルがあります。トリガーが実行されたときに、問題のテーブルを更新したストアド プロシージャの名前を知りたいです。

4

2 に答える 2

19

これは常に 100% 信頼できるとは限りません。また、そのプロシージャが内側のプロシージャを呼び出したとしても、外側のプロシージャ コールをキャプチャする場合があります。しかし、少なくとも、ユーザーが何を呼び出してトリガーに至ったのかについて、ある程度のアイデアを得ることができます。

ALTER TRIGGER dbo.whatever
ON dbo.something
FOR UPDATE
AS
BEGIN
    ... other trigger logic

    DECLARE @ExecStr varchar(50), @Qry nvarchar(255)

    CREATE TABLE #inputbuffer 
    (
      EventType nvarchar(30), 
      Parameters int, 
      EventInfo nvarchar(255)
    )

    SET @ExecStr = 'DBCC INPUTBUFFER(' + STR(@@SPID) + ')'

    INSERT INTO #inputbuffer 
    EXEC (@ExecStr)

    SET @Qry = (SELECT EventInfo FROM #inputbuffer)

    SELECT @Qry AS 'Query that fired the trigger', 
     SYSTEM_USER as LoginName, 
     USER AS UserName, 
     CURRENT_TIMESTAMP AS CurrentTime

   -- of course you can store this somewhere instead of select
END

Vyas K から盗んだもの: http://vyaskn.tripod.com/tracking_sql_statements_by_triggers.htm

この質問には、使用に関する回答がありsys.dm_exec_query_statsます。拡張イベントを使用してそれを行う長い例もあります。sys.dm_exec_sql_textGETDATE()

テーブルに影響を与えた SQL をログに記録するトリガーを作成しますか?

または、次のものを使用しますCONTEXT_INFO(ただし、これには、テーブルを更新するすべてのストアド プロシージャを変更する必要があります)。

トリガーを起動したクエリを検索

トリガーが、データを変更したストアド プロシージャの名前を見つけることは可能ですか?

最後に、いくつかのアイデアについては、これらの投稿をチェックしてください。

http://www.thecodepage.com/post/TIP-A-Call-Stack-in-SQL-Server.aspx

于 2013-01-22T21:21:04.360 に答える
-5

それは不可能です。要件に関係なく、それを回避する簡単な方法はありません。トリガーは更新に関連付けられており、SP とは関係がありません (存在しない場合もあります)。そのレベルでは、スタック トレースは利用できません。

于 2013-01-22T21:09:21.660 に答える