我一直在研究一个问题,该问题被诊断为有人在 SQL Server 2005 上将 SQL Server 数据库的兼容模式从 80 更改为 90,而该数据库的兼容模式已设置为 80,因为旧的存储过程代码尚未升级。
我发现更改兼容模式时这不会记录在 SQL Server 日志中。
有谁见过这个问题吗?这是一个错误吗?或者是否有其他方法来跟踪这些变化?
答案1
当然是记录了。简单快速的验证测试:
create database foo
alter database foo set recovery full
backup database foo to disk='nul:'
go
exec sp_dbcmptlevel 'foo', '80'
go
use foo
select * from fn_dblog(null, null)
go
变化将会出现:
LOP_MODIFY_ROW LCX_BOOT_PAGE ... 0x50
数据库的启动页已将兼容级别更新为0x50(或“80”)。
此外,该更改已记录到 ERRORLOG 中:
2010-04-08 16:15:39.37 spid52 Setting database option COMPATIBILITY_LEVEL to 80 for database 'foo'.
它还会创建系统 NT 事件日志事件:
Log Name: Application
Source: ...
Date: 4/8/2010 4:15:39 PM
Event ID: 5084
Task Category: Server
Level: Information
Keywords: Classic
User: ...
Computer: ...
Description:
Setting database option COMPATIBILITY_LEVEL to 80 for database 'foo'.
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="..." />
<EventID Qualifiers="16384">5084</EventID>
<Level>4</Level>
<Task>2</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2010-04-08T23:15:39.000000000Z" />
<EventRecordID>4965</EventRecordID>
<Channel>Application</Channel>
<Computer>...</Computer>
<Security UserID="S-1-5-..." />
</System>
<EventData>
<Data>COMPATIBILITY_LEVEL</Data>
<Data>80</Data>
<Data>foo</Data>
<Binary>...</Binary>
</EventData>
</Event>
答案2
我不相信它被记录在任何地方。它可能在默认跟踪中,但我不这么认为。sp_dbcmptlevel 的权限默认仅授予 sysadmin 固定服务器角色的成员。这缩小了谁可以执行存储过程的范围。
通过运行服务器端跟踪,您可以检测正在执行的命令,但这可能很难管理。不过,这可能是唯一可靠的方法。另一种选择是定期针对 sys.databases 运行查询,检查兼容性级别和其他更改。