2011-02-03 6 views
0

トリガーがトリガーされたためにトリガーを使用してレコードを更新する方法はありませんか?データベースロックのないトリガーによるSQL更新

私たちはUsersテーブルと、挿入、更新、削除時に起動され、変更された値をAuditテーブルに記録するトリガーを持っていますが、監査テーブルをロックして他のトリガーが監査テーブルに表示されます。

編集:はちょうど明確にするために、私が持っている問題は、複数のテーブルが異なるトリガを経由して同じ監査テーブルに報告することなので、1つの表ロック更新されてから、他のすべてのテーブルへの更新。トランザクションがロールバックした場合の懸念事項については、監査テーブルが変更追跡のためだけであり、レコードがロールバックされても監査テーブルがロールバックされなければ問題にはならないという懸念はありません。

私はそれがうまくいくかもしれないと思っていましたが、これが可能かどうか(またはそれを行う方法がわからない)、最初に呼び出されたものの代わりに新しい接続を使用する方法がありますか?

+0

トランザクションがロールバックされた場合、別のプロセスが監査テーブル内のレコードを読み取るようにしますか? –

+0

私は、監査テーブルのデータをロックしたいと思います。実際の問題はおそらく、監査テーブルのリーフノードをホットスポットしている監査テーブルに順次(おそらくクラスタ化された)プライマリキーインデックスがあり、監査テーブルにすべての挿入が同じリーフノードページに入ることです時間。プライマリキーをよりランダムなソートに変更してロック問題を解決する必要があります。 –

答えて

0

書き込み中のレコード/ページに少なくとも書き込みロックを設定しないアクションは作成できません。そうしないと、SQL Serverは常に整合性の問題が発生します。あなたは、反対の角度から見ているべきである - (監査は通常のみ更新なしに少しで読み意味)監査テーブルにアクセスする必要がある他のプロセスがロックせずに、ダーティリード(またはバージョン管理されます

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 
or 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

を使用する必要があります)
..あなたがしなければならない場合

監査表からの代わりに中間テーブルにデータを挿入し、SSSB非同期活性化スレッドが書き込みを持つことにより、サービスブローカを使用してトランザクションから書き込みを隔離する卑劣な方法がありますあなたのための監査記録は、元の長時間実行されているトランザクションをunco mmitted。

+0

データの保存の観点から、SQLはレコードロックがページロックにエスカレートするまでうまく動作するようですが、システムが稼動している間に – Seph

関連する問題