SQLCLR アセンブリにアフター トリガーを実装しています。その中で、どの列が実際に更新された (そしてそれらの値が変更された) かを知りたいです。
残念ながら、列の値が同じであっても、SqlContext.TriggerContext.IsUpdatedColumn は true を返します。おそらく、あまりスマートではないサーバー アプリケーションによって作成された SQL クエリが、ユーザーによって変更されていない列の一部であっても、すべての列を書き換えるからだと思います。
2 番目の問題は、一部の列に ntext 型があるため、INSERTED 疑似テーブルからそれらを SELECT することさえできません (MS SQL Server では、INSERTED から ntext 型を持つ SELECT フィールドを許可していません)。そのため、次のクエリで変更された行を SELECT します。
SELECT * FROM [dbo].[MyTable] WHERE [id] IN (SELECT [id] FROM INSERTED)
どの列が更新されただけでなく、変更されたのかを知るにはどうすればよいですか?
これで簡単なアイデアが浮かびました。BEFORE という別のトリガーを作成し、更新された行を内部から保存します。次に、AFTER トリガーが実行されているときに、列の値を比較します。このアイデアは私ができる最善のことですか?その場合、BEFORE トリガーと AFTER トリガーの間で変更された行を保持するのに最適な場所はどこですか? AFTER トリガーが実行される前に一時テーブルが削除されます。これは、コンテキスト接続を閉じるためです (おそらく、閉じないでください)。