0

変更をログテーブルに保存する次のトリガーがあります。しかし、それはトリガーをトリガーした変更をキャッチしませんか? それとも別の解決策がありますか?

alter trigger trigger_xxx on table1 after delete, update, insert
as
begin
  declare @lastVersion bigint = coalesce((select max(SYS_CHANGE_VERSION) from [log]), 0)

  insert into [log]
        ([SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT)
  SELECT [SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT
  FROM changetable(changes [table1], @lastVersion) as ct
end
4

1 に答える 1

1

変更の追跡は、同期を目的としています。たとえば、アプリケーション側のキャッシュを更新する必要があるかどうかを調べるために使用できます。したがって、トランザクションがコミットされる前にその情報が表示されることは望ましくありません。トリガーがトランザクション内で実行されるため、変更はまだ表示されません。

Change Tracking で利用可能な情報を複製しようとするのはなぜですか? 自分の代わりにそれらの関数と DMV を使用することはできませんか?

正当な理由があると仮定すると、おそらくトリガーを使用して、影響を受ける主キーをタイムスタンプなどの他の関連情報と一緒にキャプチャすることをお勧めします。ただし、そのトリガーを他のすべてのトリガーよりも先に実行することを強制する実際の良い方法はないため、同じ状況に陥る可能性があります。あなたのケースでは sp_settriggerorder を試すことができます: http://msdn.microsoft.com/en-us/library/ms186762.aspxあなたの状況では十分かもしれません。

于 2013-05-06T21:39:26.430 に答える