Extended Events会话中跟踪GRANT、REVOKE语句需选择哪些事件?
Extended Events跟踪GRANT、REVOKE语句的事件配置方案
你之前配置object_created、object_altered、object_deleted事件无法捕获GRANT、REVOKE操作,是因为这三类事件仅在表、视图、存储过程等数据库对象本身的结构发生创建、变更、删除时触发,而GRANT/REVOKE属于权限元数据修改操作,不会变更对象自身结构,因此不在这三类事件的捕获范围内。
优先选用的精准匹配事件
直接选择安全分类下的三个专用权限事件即可,不需要做文本匹配,捕获结果无冗余:
sqlserver.permission_grant:专门捕获所有GRANT权限操作sqlserver.permission_revoke:专门捕获所有REVOKE权限操作sqlserver.permission_deny:专门捕获所有DENY权限操作(如果需要同时跟踪拒绝权限的操作可以一并添加)
可以给上述事件配置需要捕获的关联字段,比如客户端主机名、登录名、执行的SQL文本、数据库名等,方便后续溯源。参考会话创建代码如下:
-- 创建权限跟踪扩展事件会话 CREATE EVENT SESSION [Track_Permission_Operations] ON SERVER ADD EVENT sqlserver.permission_grant( ACTION( sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.server_principal_name, sqlserver.sql_text ) ), ADD EVENT sqlserver.permission_revoke( ACTION( sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.server_principal_name, sqlserver.sql_text ) ) ADD TARGET package0.event_file(SET filename=N'Track_Permission_Operations.xel',max_file_size=10) WITH (STARTUP_STATE=OFF); GO -- 启动会话 ALTER EVENT SESSION [Track_Permission_Operations] ON SERVER STATE = START; GO
低版本兼容方案
如果你使用的是SQL Server 2008R2及更早版本,没有上述专用permission_*事件,可以选择sqlserver.statement_completed事件,添加语句文本过滤条件实现捕获:
CREATE EVENT SESSION [Track_Permission_Operations_Legacy] ON SERVER ADD EVENT sqlserver.statement_completed( ACTION( sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name, sqlserver.server_principal_name, sqlserver.sql_text ) WHERE ( sqlserver.sql_text LIKE N'%GRANT%' OR sqlserver.sql_text LIKE N'%REVOKE%' OR sqlserver.sql_text LIKE N'%DENY%' ) ) ADD TARGET package0.event_file(SET filename=N'Track_Permission_Operations_Legacy.xel',max_file_size=10) WITH (STARTUP_STATE=OFF); GO
注意使用
statement_completed加文本匹配的方式时,要注意排除SQL语句注释中包含GRANT/REVOKE关键词导致的误捕获,可以根据实际业务场景调整过滤规则的精度。
内容的提问来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

