iT邦幫忙

0

SQL Trigger 記錄異動資料同時, 將T-SQL的語法也記錄下來

  • 分享至 

  • twitterImage

各位前輩好,
小弟有用Trigger記錄資料表的異動,
但目前只能記錄到異動的欄位及資料,
異動的SQL指令無法被紀錄下來.
請問這部份該如何處理呢?
有參考以下網址的內容:
Trigger的用法:
https://dotblogs.com.tw/jamesfu/2014/06/20/triggersample
如何找到執行中的程序:
https://www.huanlintalk.com/2012/05/sysdmexecrequests.html
也試著處理過.
但結果卻都是記下Trigger的指令, 而不是實際執行INSERT, UPDATE, DELETE的指令.
請各位前輩幫忙解惑.
謝謝.

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-19 09:17:24

以下是一個範例的 Trigger,可以在 INSERT、UPDATE、DELETE 時紀錄異動資料以及執行的 T-SQL 陳述式。

CREATE TRIGGER [dbo].[LogTableChanges]
ON [dbo].[MyTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    DECLARE @event_type nvarchar(100), @schema_name nvarchar(100), @object_name nvarchar(100), @tsql nvarchar(max);

    SELECT @event_type = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)');
    SELECT @schema_name = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(100)');
    SELECT @object_name = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)');
    SELECT @tsql = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)');

    IF @event_type = 'INSERT'
    BEGIN
        -- Insert logic and logging here
    END

    IF @event_type = 'UPDATE'
    BEGIN
        -- Update logic and logging here
    END

    IF @event_type = 'DELETE'
    BEGIN
        -- Delete logic and logging here
    END

    -- Log the T-SQL statement
    INSERT INTO [dbo].[LogTableChanges] (EventDateTime, EventType, SchemaName, ObjectName, TSQLCommand)
    VALUES (GETDATE(), @event_type, @schema_name, @object_name, @tsql);
END

我要發表回答

立即登入回答