建立資料庫層級 DDL 觸發器,自動記錄預存程序的 CREATE、ALTER、DROP 操作,包含執行者、時間、事件類型與完整事件 XML,滿足合規稽核與變更追蹤需求。
CREATE TABLE AuditStoredProcedures (
DatabaseName SYSNAME,
ObjectName SYSNAME,
LoginName SYSNAME,
ChangeDate DATETIME DEFAULT GETDATE(),
EventType SYSNAME,
EventDataXml XML
);
CREATE TRIGGER dbtAuditStoredProcedures ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN
DECLARE @eventdata XML = EVENTDATA();
INSERT INTO AuditStoredProcedures (DatabaseName, ObjectName, LoginName, ChangeDate, EventType, EventDataXml)
VALUES (
@eventdata.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'SYSNAME'),
@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME'),
@eventdata.value('(/EVENT_INSTANCE/LoginName)[1]', 'SYSNAME'),
GETDATE(),
@eventdata.value('(/EVENT_INSTANCE/EventType)[1]', 'SYSNAME'),
@eventdata
);
END;
ON DATABASE 範圍:僅限當前資料庫;若需伺服器層級改用 ON ALL SERVER。EVENTDATA() 函數:回傳觸發事件完整 XML,含 T-SQL 命令文本、物件定義、設定選項等豐富上下文。.value() XQuery 提取:安全轉型為強型別欄位,避免 XML 解析錯誤。CREATE INDEX IX_Audit_ChangeDate ON AuditStoredProcedures(ChangeDate);CREATE_TABLE、ALTER_TABLE、DROP_TABLE 等 DDL 事件。sys.sql_modules 對比定義異動內容(DIFF)。建立觸發器需 ALTER ANY DATABASE DDL TRIGGER 權限(通常由 db_owner 或 sysadmin 擁有)。