私は同様の要件を持っていますが、監査追跡に必要なすべてのテーブルにこれらの4つの列を追加することによって、それについて行きました:
CREATE TRIGGER [SomeSchema].[Some_Table_Insert_Create] ON [SomeSchema].[Some_Table] FOR INSERT AS
SET NOCOUNT ON
IF EXISTS(SELECT * FROM INSERTED WHERE Create_User IS NOT NULL)
BEGIN
UPDATE [SomeSchema].[Some_Table] SET
Create_Date = SYSDATETIMEOFFSET()
FROM
[SomeSchema].[Some_Table]
INNER JOIN
INSERTED
ON
[SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id
END
ELSE
BEGIN
UPDATE [SomeSchema].[Some_Table] SET
Create_User = SUSER_SNAME(),
Create_Date = SYSDATETIMEOFFSET()
FROM
[SomeSchema].[Some_Table]
INNER JOIN
INSERTED
ON
[SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id
END
そしてUPDATE:INSERTトリガーがどのように見える
[Create_User] [nvarchar](100) NULL,
[Create_Date] [datetimeoffset](7) NULL,
[Modify_User] [nvarchar](100) NULL,
[Modify_Date] [datetimeoffset](7) NULL,
をトリガーは次のようになります:
CREATE TRIGGER [SomeSchema].[Some_Table_Update_Modify] ON [SomeSchema].[Some_Table] FOR UPDATE AS
SET NOCOUNT ON
IF NOT UPDATE (Create_User) AND NOT UPDATE (Create_Date)
BEGIN
IF EXISTS(SELECT * FROM INSERTED WHERE Modify_User IS NOT NULL)
BEGIN
UPDATE [SomeSchema].[Some_Table] SET
Modify_Date = SYSDATETIMEOFFSET()
FROM
[SomeSchema].[Some_Table]
INNER JOIN
INSERTED
ON
[SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id
END
ELSE
BEGIN
UPDATE [SomeSchema].[Some_Table] SET
Modify_User = SUSER_SNAME(),
Modify_Date = SYSDATETIMEOFFSET()
FROM
[SomeSchema].[Some_Table]
INNER JOIN
INSERTED
ON
[SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id
END
END
SUSER_SNAME()関数は便利ですなぜなら私たちはアプリとウィンドウ認証で偽装を使用してDBに接続しているからです。あなたのケースではこれはうまくいかないかもしれません。
SQL Server 2008の監査機能を使用する - 重複する質問と回答を参照 –