3

すべてのテーブルの履歴を 1 つのテーブルに統合することはできますか?

が提供する CDC 機能を使用しようとしましたSQL server 2012 enterprise editionが、そのためにすべてのテーブルのコピーが作成され、データベース内のテーブルの数が増加します。

DMLが発生したテーブル名&カラム名を履歴テーブルに追跡&挿入することも可能ですか?これにより、パフォーマンスに問題が発生しますか?

4

2 に答える 2

1

トリガーを使用したソリューションの 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

記事はこちら。

http://craftydba.com/?p=2060

以下の画像は、複数の [TRG_TRACK_DML_CHGS_XXX] トリガーを持つ単一の [LOG_DML_CHANGES] テーブルを示しています。

ここに画像の説明を入力

于 2014-01-07T15:02:13.993 に答える