多くのデータを返すか、変更を照会するのが難しいアプリを介して更新されるテーブルが多数あります。この問題を回避するために、単一行の「LastUpdated」テーブルを作成し、LastUpdated テーブルの適切な列に対して GetDate() を設定するだけのこれらの複雑なテーブルにトリガーを設定しました。
CREATE TRIGGER [dbo].[trg_ListItem_LastUpdated] ON [dbo].[tblListItem]
FOR INSERT, UPDATE, DELETE
AS
UPDATE LastUpdated SET ListItems = GetDate()
GO
このように、クライアントはこのテーブルに最後に更新された値を照会するだけでよく、複雑なテーブルからデータを更新する必要があるかどうかを判断できます。複雑なテーブルは、スナップショット分離を使用してダーティ リードを防止しています。
忙しいシステムでは、「LastUpdated」での更新の競合が原因で、1 日に 1 回程度、複雑なテーブルのデータの書き込みまたは更新でエラーが発生します。これはトリガーによって実行されるステートメントで発生するため、影響を受ける複合テーブルはデータの保存に失敗します。次のエラーが記録されます。
更新の競合により、スナップショット分離トランザクションが中止されました。スナップショット分離を使用して、データベース 'devDB' のテーブル 'dbo.tblLastUpdated' に直接的または間接的にアクセスし、別のトランザクションによって変更または削除された行を更新、削除、または挿入することはできません。トランザクションを再試行するか、更新/削除ステートメントの分離レベルを変更してください。
この失敗を防ぐために、トリガーでここで何をすべきですか? これを回避するために、トリガーである種のクエリヒントを使用できますか?または、トリガーのエラーを無視できますか? LastUpdated のデータを更新することは重要ではありませんが、複雑なテーブルにデータを正しく保存することは重要です。
これはおそらく、私が見落としている、または気づいていない非常に単純なことです。いつものように、情報をありがとう。