2017-10-02 8 views
1

トリガーを作成していて、行を編集するときに、削除済みと挿入済みのすべての列を解析したいとします。したがって、Deletedのcol1がInsertedのcol1と異なる場合、この変更を別のテーブルに保存します。これは私がこれを達成した方法ですが、私はそれを動的にしたいと思います。 ** **トリガーは、あるべき非常に小さく、軽快**を、それが可能な作業の**最小限の量を行う必要があります..:警告の削除済みと挿入済みの各列のSQL

IF UPDATE(Cisitid) 
    insert into [dbo].[AuditTrailCTables]([TSid],[TableName],[TSField],[OldValue], 
    [NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated]) 
     select Cisitid,@tablename,'Cisitid', @audit_oldvalue, 
    @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), 'Cisitid' 
    from inserted 

etc.. 
+1

Wordを:

if not exists (select * from deleted d join inserted i on d.Cisitid = i.Cisitid) and @Action in ('U') -- UpdateCisitid BEGIN select @audit_oldvalue = Cisitid from deleted; select @audit_value = Cisitid from inserted; insert into [dbo].[AuditTrailCTables]([TSid],[TableName],[TSField],[OldValue],[NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated]) select Cisitid,@tablename,'Cisitid', @audit_oldvalue, @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), 'Cisitid' from inserted --Cformid select @audit_oldvalue = Cformid from deleted; select @audit_value = Cformid from inserted; insert into [dbo].[AuditTrailCTables]([TSid],[TableName],[TSField],[OldValue],[NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated]) select Cisitid,@tablename,'Cformid', @audit_oldvalue, @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), 'Cformid' from inserted --CreatedDate select @audit_oldvalue = CreatedDate from deleted; select @audit_value = CreatedDate from inserted; insert into [dbo].[AuditTrailCTables]([TSid],[TableName],[TSField],[OldValue],[NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated]) select Cisitid,@tablename,'CreatedDate', @audit_oldvalue, @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), 'CreatedDate' from inserted --CreatedBy select @audit_oldvalue = CreatedBy from deleted; select @audit_value = CreatedBy from inserted; insert into [dbo].[AuditTrailCTables]([TSid],[TableName],[TSField],[OldValue],[NewValue],[changedate],[Change_Action],[Change_user],[Columns_Updated]) select Cisitid,@tablename,'CreatedBy', @audit_oldvalue, @audit_value,getdate(),@Action, coalesce(ModifiedBy,suser_name()), 'CreatedBy' from inserted END 

+0

[CDC](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server)を試しましたか? –

+0

トリガーには大きな根本的な欠陥があります。挿入されたテーブルと削除されたテーブルには1つの行しか存在しないことが前提です。 SQL Serverでは、トリガーは操作ごとに1回トリガーされるため、トリガーを基に設定する必要があります。これは、2行でさえ影響を与える挿入または更新では悲惨に失敗します。 –

答えて

0

はUPDATE機能を使用してみてください.. **大規模な計算、大量のデータ操作などをトリガーに入れない**。これは災害のレシピです。トリガーは、このトリガーの発生原因となったステートメントのコンテキストおよびトランザクション*で実行されています。このステートメントは、トリガーが完了するまでブロックされます。あなたのトリガーがやっている仕事の量を**スケールダウン**しよう!
+0

しかし、この解決法はそれを動的にしません。たとえば、列名を変更したり、新しい列を追加したりすると、その列は機能しません。それで、なぜ私は削除された行のようなものを探しているのですか? – alxem

+0

@alxem上記のコメントで述べたように、DDLの変更に対して(複数のIF UPDATE文を使用して)トリガを動的に再作成します。 – cloudsafe

関連する問題