SQL Server 2000 僅有 DML Trigger (`INSERT/UPDATE/DELETE`),無法追蹤 `CREATE TABLE`、`ALTER LOGIN`、`GRANT` 等結構/安全變更。2005 引入 **DDL Trigger**,配合 `XML` 資料型別儲存事件完整內容,**零成本建構企業級審計系統**,滿足 SOX (Sarbanes-Oxley) 合規需求。
CREATE DATABASE DDLTriggerTest;
GO
USE DDLTriggerTest;
GO
CREATE TABLE EventTableData (
IDCol SMALLINT IDENTITY(1,1) PRIMARY KEY,
XMLEvent XML, -- 事件完整 XML (EVENTDATA() 回傳)
DatabaseName VARCHAR(50),
SystemUser VARCHAR(50),
EntryDate DATETIME DEFAULT GETDATE()
);
CREATE TRIGGER tr_Security
ON ALL SERVER
FOR DDL_LOGIN_EVENTS
AS
BEGIN
INSERT INTO DDLTriggerTest..EventTableData (XMLEvent, DatabaseName, SystemUser)
VALUES (EVENTDATA(), DB_NAME(), SYSTEM_USER);
END;
GO
CREATE LOGIN
2024-01-15T10:30:00.123
52
NewUser
SQL Login
master
us_english
APP-SERVER-01
Microsoft SQL Server Management Studio
CREATE LOGIN [NewUser] WITH PASSWORD=******
USE YourDB;
GO
CREATE TRIGGER tr_DDLAudit
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS -- CREATE/ALTER/DROP TABLE, VIEW, PROC, INDEX, TRIGGER, SYNONYM, etc.
AS
BEGIN
INSERT INTO DDLTriggerTest..EventTableData (XMLEvent, DatabaseName, SystemUser)
VALUES (EVENTDATA(), DB_NAME(), SYSTEM_USER);
END;
GO
| 優勢 | 限制 |
|---|---|
| 零授權成本 (內建功能) | 僅記錄 DDL,不記錄 SELECT/資料存取 (需 SQL Audit/Extended Events) |
| XML 完整保留事件上下文 | 高頻 DDL 環境可能產生大量寫入,需評估審計庫 IO |
| Server 級觸發器一次部署全例覆蓋 | Trigger 本身可被 `DISABLE TRIGGER` / `DROP TRIGGER` (需高權限),建議審計 Trigger 自身變更也納入審計 |
| 支援 `ON ALL SERVER` / `ON DATABASE` 彈性範圍 | 含資料庫備份/還原時 Trigger 定義會隨庫移動,需部署腳本確保一致性 |
**DDL Trigger + XML 事件資料 = 最輕量的結構/安全審計基礎設施**。SOX 合規、變更管理、安全稽核三合一。現代環境建議 **SQL Server Audit 為主、DDL Trigger 為輔 (即時攔截/自定義邏輯)**,雙軌並行最安心。