1

特定のテーブルのテーブル名、列名、前/新しい値、日付、時刻、およびユーザーを使用して、更新された列のみを監査テーブルに書き込むために、SQL Server でトリガーを作成する必要があります。これどうやってするの?

4

2 に答える 2

7

監査が必要なテーブルが多数あるため、サードパーティのツールである ApexSQL Auditを使用して監査トリガーを生成しています。

サード パーティのツールが必要ない場合は、これを試用モードで使用して、トリガーとストレージ テーブルがどのように実装されているかを確認できます。

以下は、データベースから簡単にピックアップしたトリガー テーブルとストレージ テーブルのサンプルです。

データ保存テーブル:

ここに画像の説明を入力

トランザクションの詳細を格納するテーブル:

ここに画像の説明を入力

削除トリガーのサンプルを次に示します。インラインのコメントに注意してください

CREATE TRIGGER [dbo].[tr_d_AUDIT_Table_Name]
ON [dbo].[Table_Name]
FOR DELETE
NOT FOR REPLICATION
AS

BEGIN
    DECLARE 
        @IDENTITY_SAVE              varchar(50),
        @AUDIT_LOG_TRANSACTION_ID       Int,
        @PRIM_KEY               nvarchar(4000),
        @ROWS_COUNT             int

    SET NOCOUNT ON


    Select @ROWS_COUNT=count(*) from deleted
    Set @IDENTITY_SAVE = CAST(IsNull(@@IDENTITY,1) AS varchar(50))

    INSERT
    INTO dbo.AUDIT_LOG_TRANSACTIONS
    (
        TABLE_NAME,
        TABLE_SCHEMA,
        AUDIT_ACTION_ID,
        HOST_NAME,
        APP_NAME,
        MODIFIED_BY,
        MODIFIED_DATE,
        AFFECTED_ROWS,
        [DATABASE]
    )
    values(
        'Table_Name',
        'dbo',
        3,  
        CASE 
          WHEN LEN(HOST_NAME()) < 1 THEN ' '
          ELSE HOST_NAME()
        END,
        CASE 
          WHEN LEN(APP_NAME()) < 1 THEN ' '
          ELSE APP_NAME()
        END,
        SUSER_SNAME(),
        GETDATE(),
        @ROWS_COUNT,
        'database_name'
    )

    Set @AUDIT_LOG_TRANSACTION_ID = SCOPE_IDENTITY()

    INSERT
    INTO dbo.AUDIT_LOG_DATA
    (
        AUDIT_LOG_TRANSACTION_ID,
        PRIMARY_KEY_DATA,
        COL_NAME,
        OLD_VALUE_LONG,
        DATA_TYPE
        , KEY1
    )
    SELECT
        @AUDIT_LOG_TRANSACTION_ID,
        convert(nvarchar(1500), IsNull('[Order_ID]='+CONVERT(nvarchar(4000), OLD.[Order_ID], 0), '[Order_ID] Is Null')),
        'Order_ID',
        CONVERT(nvarchar(4000), OLD.[Order_ID], 0),
        'A'
        ,  CONVERT(nvarchar(500), CONVERT(nvarchar(4000), OLD.[Order_ID], 0))
    FROM deleted OLD
    WHERE
        OLD.[Order_ID] Is Not Null

    /*
       Insert statement above is replicated for each column being audited
     */

END  
于 2013-10-17T11:03:23.200 に答える