2

データベース レベルのアプリケーションでは、スキーマ Billing および Billing_History に Installments というテーブルがあります。

表示されているトリガーは、課金スキーマの分割払いテーブルにあります。

これが行うことは、課金スキーマでレコードが挿入/更新されるたびに、履歴ファイルにも書き込まれます。

レコードが課金テーブルから削除されると、「削除済み」インジケータ = true で履歴テーブルに書き込まれます。

「If Not Exists (Select * from Inserted) は、レコードが追加されるにつれてパフォーマンスを低下させていると思います。

このトリガーを作成するより効率的な方法はありますか?

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History]
ON [Billing].[Installments]
AFTER INSERT, DELETE, UPDATE
AS BEGIN
Insert Into Billing_History.Installments
    Select *, GetDate(), 0 From Inserted

If Not Exists (Select * From Inserted)
    Insert Into Billing_History.Installments
        Select *, GetDate(), 1 From Deleted

SET NOCOUNT ON;

-- Insert statements for trigger here

終わり

4

3 に答える 3

1

必要なタスクを考えると、あなたが持っているトリガーフォームが最高のパフォーマンスを発揮することをお勧めします。同じ監査結果を達成するのにこれほど優れた方法はありません。

ここでの答えは、Creating audit triggers in SQL Server に同意します。ここでは、監査ソリューションのパフォーマンスに関する長い議論があります。

UPDATE 状況では削除された (元の) テーブルが実際には必要ないため、状況は少し異なります。したがって、IF です。

于 2012-09-27T20:57:46.400 に答える
0

この簡単な変更を行うことができます。

Create TRIGGER [Billing].[Installments_InsertDeleteUpdate_History]
ON [Billing].[Installments]
AFTER INSERT, DELETE, UPDATE
AS BEGIN

If Not Exists (Select * From Inserted)
    Insert Into Billing_History.Installments
        Select *, GetDate(), 1 From Deleted
ELSE
    Insert Into Billing_History.Installments
        Select *, GetDate(), 0 From Inserted

SET NOCOUNT ON;

-- Insert statements for trigger here

どちらが論理的に効率的ですが、物理的にパフォーマンスが高いかどうかは未解決の問題です。それが実際に速い場合、それは確かにそれほど速くはありません。

于 2012-09-27T21:47:10.303 に答える
0

INSERT と UPDATE 用に 1 つのトリガーを作成し、DELETE 用にもう 1 つトリガーを作成します。そうすれば、IF ステートメントや低速なクエリを使用して、ログを記録する場所を確認する必要がなくなります。

設計の観点から、トリガーを排除できるかどうかを確認してください。彼らは混乱しています。

于 2012-09-27T20:27:45.330 に答える