如何查询SQL Server数据库COMPATIBILITY_LEVEL的变更时间与操作人?
关于SQL Server 2017数据库兼容级别修改记录的查询方法
你此前在SQL Server错误日志中搜索COMPATIBILITY_LEVEL关键词无结果属于正常情况,修改兼容级别的操作默认不会写入普通错误日志。你可以按以下方案尝试排查:
1. 查询默认跟踪(Default Trace)获取修改记录
SQL Server默认开启的默认跟踪会记录核心DDL操作,包含修改兼容级别的操作,记录保留时间取决于实例的跟踪文件滚动策略,通常可查询到最近数天到数周的操作记录。
执行以下查询即可获取对应记录:
SELECT te.name AS EventName, t.DatabaseName, t.NTDomainName, t.LoginName AS OperationUser, t.StartTime AS ModifyTime, t.TextData AS ExecutionSQL FROM sys.fn_trace_gettable(CONVERT(VARCHAR(150), (SELECT TOP 1 [path] FROM sys.traces WHERE is_default = 1)), DEFAULT) t INNER JOIN sys.trace_events te ON t.EventClass = te.trace_event_id WHERE t.TextData LIKE '%COMPATIBILITY_LEVEL%' AND t.DatabaseName = N'替换为你的实际数据库名' ORDER BY t.StartTime DESC;
如果查询返回结果,即可直接获取修改时间、操作用户和实际执行的SQL语句。如果无返回结果,说明操作发生时间较早,已经被滚动覆盖的跟踪文件清除,没有提前配置审计的情况下无法再追溯。
2. 判断兼容级别是否为数据库初始设置
你可以通过数据库创建时间和来源判断当前兼容级别是否为创建时默认配置:
- 执行以下语句查询数据库基础信息:
SELECT name, create_date, compatibility_level FROM sys.databases WHERE name = N'替换为你的实际数据库名';
- 如果该数据库是从SQL Server 2008实例备份还原、或者直接附加到2017实例的,默认会保留原实例的100兼容级别,不需要额外修改操作,当前值就是初始设置。
- 如果该数据库是在2017实例上新建的,默认兼容级别为140,若当前为100则肯定是后续人为修改的。
3. 后续审计配置建议
如果需要后续可追溯兼容级别的修改操作,可配置服务器级审计规范或者自定义扩展事件会话,捕获ALTER DATABASE类操作,后续修改操作会自动记录操作人和时间。
内容的提问来源于stack exchange,提问作者A K
相关产品推荐
相关产品推荐

