未记录 SQL Server 兼容模式

未记录 SQL Server 兼容模式

我一直在研究一个问题,该问题被诊断为有人在 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 运行查询,检查兼容性级别和其他更改。

相关内容