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