[SQL]不要偷刪除我的資料啦 !

[SQL]不要偷刪除我的資料啦 !

既上次放個陷阱來抓偷改資料庫的傢伙後 (詳見 : [SQL]不要偷改我的資料庫啦 ! ),果然風平浪靜了一陣子,正想要順利結案之際,客戶端又忽然冒出一個問題了,某些資料表的資料會無故不見了,懷疑是我們程式沒有正常寫入,因此又衍生出另外一個案外案出來了。

 

為了針對那些 Table,原本想說開個 SQL Profile 來攔截就好了,但因為又怕影響 Server 端的效能,因此就做個簡單的 Trigger 來追蹤囉。首先先建立一個來存放紀錄的 Table

CREATE TABLE [dbo].[_sessioninfo](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [host_name] [nvarchar](128) NULL,
    [program_name] [nvarchar](128) NULL,
    [login_name] [nvarchar](128) NULL,
    [nt_user_name] [nvarchar](128) NULL,
    [process_time] [datetime] NULL DEFAULT (getdate()),
) ON [PRIMARY]

 

接下來我在要稽核的 Table 上面建立一組 Trigger

CREATE TRIGGER dbo.T1_Delete_Trigger
   ON  dbo.T1 AFTER DELETE
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO dbo._sessioninfo ( host_name,program_name,login_name,nt_user_name ) 
        SELECT host_name,program_name,login_name,nt_user_name FROM sys.dm_exec_sessions 
            WHERE session_id = @@SPID
END
GO

 

以這個範例來說,我在 T1 這個 Table 上面建立一 個 DELETE 事件的 Trigger,配合 @@SPID 取得命令的 Session ID 之後,透過 dm_exec_sessions 這個 DMV 來取得該 Session 連線的資訊,並且將這些資訊存放到 _sessioninfo 這個 Table 內。因此只要對這個 Table 刪除資料的時候,我們就會知道這個命令是從哪台電腦上使用哪個帳號登入 SQL Server 所下的指令。