能否用ABSOLUTELY_EVERYTHING创建监控所有DDL操作的SQL Server触发器?
监控SQL Server所有DDL变更的正确姿势
哈哈,很遗憾SQL Server里并没有ABSOLUTELY_EVERYTHING这种万能的DDL事件简写!不过你想要监控所有数据库级的DDL变更,其实有更省心的办法——用DDL_DATABASE_LEVEL_EVENTS这个预定义的事件组。
这个事件组会自动捕获几乎所有数据库层面的DDL操作,包括你最初设置的存储过程创建/修改/删除,还涵盖了表、视图、函数、索引、用户、角色、同义词等对象的各类DDL变更,基本覆盖了你查到的200多种DDL事件里的绝大多数场景。
示例代码:创建全DDL监控触发器
下面是一个实用的示例,触发器会把所有DDL操作的关键信息记录到自定义的日志表中(你需要先创建这个日志表):
-- 先创建用于存储DDL变更日志的表 CREATE TABLE DDLChangeLog ( LogID INT IDENTITY(1,1) PRIMARY KEY, EventTime DATETIME NOT NULL DEFAULT GETDATE(), EventType NVARCHAR(100) NOT NULL, ObjectName NVARCHAR(256), EventDetails NVARCHAR(MAX) NOT NULL ); GO -- 创建监控所有数据库级DDL事件的触发器 CREATE TRIGGER DDLTrigger_CaptureAllDBEvents ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS BEGIN SET NOCOUNT ON; -- 提取事件数据并插入日志表 INSERT INTO DDLChangeLog (EventType, ObjectName, EventDetails) VALUES ( EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'), EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(256)'), EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'NVARCHAR(MAX)') ); END; GO
额外注意事项
- 如果需要监控整个SQL Server实例中所有数据库的DDL变更,你需要创建服务器级触发器,把
ON DATABASE替换成ON ALL SERVER,对应的事件组用DDL_SERVER_LEVEL_EVENTS。 - 要留意性能影响:高并发环境下,所有DDL操作都会触发这个触发器,建议定期清理日志表,或者对日志表做分区优化,避免影响数据库性能。
- 权限方面:创建数据库级DDL触发器需要
ALTER ANY DATABASE DDL TRIGGER权限,写入日志表需要对应的INSERT权限。
内容的提问来源于stack exchange,提问作者pGrnd2
相关产品推荐
相关产品推荐

