1

SQL Server 2008 では、トリガーを使用して、データベース内の特定のテーブルに加えられたすべての変更をキャプチャしています。私の目標は、変更全体をキャプチャすることです。つまり、データが挿入されているだけでなく、どのデータが挿入されているかを把握するためです。トリガーでは、DBCC INPUTBUFFER によって返された結果セットの EventInfo 列を使用して、現在実行中の SQL ステートメントを取得し、Parameters 列を使用して、使用されているパラメーターの数を取得しています。これはほとんどの場合に機能しますが、外部アプリケーションが ADO​​.NET を使用してクエリを実行する場合、または SSMS の [上位 200 行の編集] を使用して行が挿入/削除される場合、EventInfo にはパラメーター値がありません。

たとえば、文字列クエリがクエリ ウィンドウで実行された場合、または ADO.NET でパラメーター化されていない文字列クエリとして実行された場合、EventInfo は次のように表示されます。

  INSERT INTO DTS_TABLE ([ID] ,[DTS_ID] ,[DTS] ,[TICS])  VALUES (10, 9, GETDATE(), 91234)  

Edit Top 200 Rows または ADO.NET のパラメーター化されたクエリを使用して同じデータを挿入すると、EventInfo に次のように表示されます (読みやすくするために改行が追加されています)。

(@id int,@dtsid int,@dts datetime,@tics int)
INSERT INTO DTS_TABLE ([ID] ,[DTS_ID] ,[DTS] ,[TICS])  
VALUES (@id, @dtsid, @dts, @tics)

トリガーのコンテキスト内でパラメーター値にアクセスする方法はありますか?

4

1 に答える 1

0

なぜパラメータ値を気にするのですか?気にする必要があるのは、テーブル内の古い値と新しい値だけです(更新の場合は古い値と新しい値-挿入の場合は新しい値のみ)。

SQL Server 2008を使用しているため、新しい監査機能を確認する必要があります。利用可能な詳細がはるかに多く、トリガーを使用するよりもパフォーマンスが大幅に向上します。

これは、新機能を使用して利用できる情報を説明するページです。

新機能のページを作成する方法は次のとおりです。

于 2010-01-13T00:07:19.310 に答える