トリガー(更新時)を持つテーブルがあります。トリガーが実行されたときに、問題のテーブルを更新したストアド プロシージャの名前を知りたいです。
2 に答える
これは常に 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_text
GETDATE()
テーブルに影響を与えた SQL をログに記録するトリガーを作成しますか?
または、次のものを使用しますCONTEXT_INFO
(ただし、これには、テーブルを更新するすべてのストアド プロシージャを変更する必要があります)。
トリガーが、データを変更したストアド プロシージャの名前を見つけることは可能ですか?
最後に、いくつかのアイデアについては、これらの投稿をチェックしてください。
http://www.thecodepage.com/post/TIP-A-Call-Stack-in-SQL-Server.aspx
それは不可能です。要件に関係なく、それを回避する簡単な方法はありません。トリガーは更新に関連付けられており、SP とは関係がありません (存在しない場合もあります)。そのレベルでは、スタック トレースは利用できません。