すべてのテーブルの履歴を 1 つのテーブルに統合することはできますか?
が提供する CDC 機能を使用しようとしましたSQL server 2012 enterprise edition
が、そのためにすべてのテーブルのコピーが作成され、データベース内のテーブルの数が増加します。
DMLが発生したテーブル名&カラム名を履歴テーブルに追跡&挿入することも可能ですか?これにより、パフォーマンスに問題が発生しますか?
すべてのテーブルの履歴を 1 つのテーブルに統合することはできますか?
が提供する CDC 機能を使用しようとしましたSQL server 2012 enterprise edition
が、そのためにすべてのテーブルのコピーが作成され、データベース内のテーブルの数が増加します。
DMLが発生したテーブル名&カラム名を履歴テーブルに追跡&挿入することも可能ですか?これにより、パフォーマンスに問題が発生しますか?
トリガーを使用したソリューションの 1 つを次に示します。
1 - 履歴が必要なテーブルごとにトリガーを作成します。
2 - アクション中に、変更されたデータ (INS、UPD、DEL) をベース テーブルから監査テーブルにコピーします。
3 - 複数のテーブルが同じ監査テーブルにデータを格納できるように、すべてのデータを XML 形式で格納します。
これについては、ブログ記事の 1 つで取り上げました。これは、少量のデータを監査するための優れたソリューションです。毎秒数千のレコード変更を処理する場合、オーバーヘッドの問題が発生する可能性があります。
本番環境にデプロイする前にテストしてください!
これは、テーブル名と変更の種類を追跡する監査テーブルです。
/*
Create data level auditing - table.
*/
-- Remove table if it exists
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[ADT].[LOG_DML_CHANGES]') AND type in (N'U'))
DROP TABLE [ADT].[LOG_DML_CHANGES]
GO
CREATE TABLE [ADT].[LOG_DML_CHANGES]
(
[ChangeId]BIGINT IDENTITY(1,1) NOT NULL,
[ChangeDate] [datetime] NOT NULL,
[ChangeType] [varchar](20) NOT NULL,
[ChangeBy] [nvarchar](256) NOT NULL,
[AppName] [nvarchar](128) NOT NULL,
[HostName] [nvarchar](128) NOT NULL,
[SchemaName] [sysname] NOT NULL,
[ObjectName] [sysname] NOT NULL,
[XmlRecSet] [xml] NULL,
CONSTRAINT [pk_Ltc_ChangeId] PRIMARY KEY CLUSTERED ([ChangeId] ASC)
)
GO
記事はこちら。
以下の画像は、複数の [TRG_TRACK_DML_CHGS_XXX] トリガーを持つ単一の [LOG_DML_CHANGES] テーブルを示しています。