2010-11-23 6 views
8

データベース内のいくつかのテーブルのメンテナンスを行うために、いくつかの異なるシステムによってルーチン的に呼び出されるストアドプロシージャがいくつかあります。自動化されているものもありますトリガでデータを変更したストアドプロシージャの名前を見つけることは可能ですか?

テーブルの1つに番号がオフになっている列がありますが、いつ起こっているのか、理由がわからないのです。私はテーブルにトリガを入れて何が変更されているのかを見ることができますが、どのプロシージャが変更を開始したのかを知ることも役立ちます。

トリガからストアドプロシージャの名前を取得できますか?そうでない場合は、何が何が修正されたのかを伝える他の方法がありますか? (私はユーザーについても話していませんが、ユーザーの名前はこの場合は役に立ちません)。

+0

実行可能なストアドプロシージャではない可能性があるので、単純なバッチだった可能性があります。私は間違っているかもしれませんが、私はあなたの場合、特定のテーブルを含む最近のバッチのリストを取得するための何らかの方法を調べるべきだと言います。 – BeemerGuy

答えて

3

あなたが試すことができます:ここ

CONTEXT_INFOがCONTEXT_INFOの使用例です:挿入を行うすべての手順で

/追跡したい/更新を削除し、これを追加します。

DECLARE @string  varchar(128) 
     ,@CONTEXT_INFO varbinary(128) 
SET @string=ISNULL(OBJECT_NAME(@@PROCID),'none') 
SET @CONTEXT_INFO =cast('Procedure='[email protected]+REPLICATE(' ',128) as varbinary(128)) 
SET CONTEXT_INFO @CONTEXT_INFO 

--do insert/delete/update that will fire the trigger 

SET CONTEXT_INFO 0x0 --clears out the CONTEXT_INFO value 

ここに値を取得するトリガーの部分があります:

DECLARE @string   varchar(128) 
     ,@sCONTEXT_INFO varchar(128) 
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE [email protected]@SPID 

IF LEFT(@sCONTEXT_INFO,9)='Procedure' 
BEGIN 
    SET @string=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10) 
END 
ELSE 
BEGIN --optional failure code 
    RAISERROR('string was not specified',16,1) 
    ROLLBACK TRAN 
    RETURN 
END 

..use the @string 
+0

@KM、ありがとう、私はこれを打つつもりだが、もし私のチームが一時的なデバッグのためにすべてのストアドプロシージャを調べて修正することに私のチームが興奮しているのであれば、私は確信していない:P – Brandon

+0

は、バグ?トリガーはいつか痛みになることがあります。 –

+0

APP_NAME()はさまざまなシステムをトラッキングするのに役立ちます。 – user423430

-4

私はこれを試していませんが、@@ PROCIDはあなたが望むものを返すかもしれないようです。

+4

私はあなたがトリガーコードの中にいれば、トリガー自体のIDを返すと信じています。 –

+1

が正しい。 @@ procid(またはobject_name(@@ procid))は、挿入がどこから来たかを知るためにテーブルのカラムのデフォルト値として便利です。 – bwperrin

1

私たちのシステムはすでに別の目的のためにCONTEXT_INFO変数を使用していますので、利用できません。私もほぼ成功したDBCC INPUTBUFFER solutionを試しました。入力バッファへの引き戻しは、外部呼び出しプロシージャのみを返すことです。例:procAはprocBを呼び出してトリガを起動します。トリガはprocAのみを表示するDBCC INPUTBUFFERを実行します。私の引き金がprocBを探していたので、このアプローチは失敗しました。

私が行ったことは、ステージングテーブルを作成することです。今度はprocAがprocBを呼び出します。 procBはステージング・テーブルに行を挿入してからトリガーを起動します。トリガーはステージングテーブルをチェックし、procBエントリを検出します。リターンするとprocBはそのエントリをステージングテーブルから削除します。それはシェルゲームですが、動作します。私はこれに関するどんなフィードバックにも興味があります。

関連する問題