如何查询SQL Server 2019数据库被设为只读模式的时间戳与操作用户
查询SQL Server 2019数据库只读模式变更的操作时间与执行账号
SQL Server的默认跟踪和错误日志都会记录数据库配置变更操作,你可以通过以下两种方法查询:
方法1:通过默认跟踪查询(默认开启,优先使用)
默认跟踪是SQL Server默认启用的轻量跟踪功能,会记录所有数据库修改类操作,只要操作发生后跟踪文件还未被滚动覆盖,就能查到完整的操作信息。
将下面代码中的你要查询的数据库名称替换为目标库的名称后执行即可:
DECLARE @TargetDB NVARCHAR(128) = N'你要查询的数据库名称'; DECLARE @DefaultTracePath NVARCHAR(256); -- 校验默认跟踪是否开启 SELECT @DefaultTracePath = CAST(value AS NVARCHAR(256)) FROM sys.configurations WHERE name = 'default trace enabled'; IF @DefaultTracePath = 1 BEGIN -- 获取默认跟踪文件路径 SELECT @DefaultTracePath = REVERSE(SUBSTRING(REVERSE(path), CHARINDEX('\', REVERSE(path)), 256)) + N'log.trc' FROM sys.traces WHERE is_default = 1; -- 过滤只读变更操作记录 SELECT EventTime AS 操作时间戳, LoginName AS 执行操作的登录账号, ApplicationName AS 操作所用的应用程序, HostName AS 操作发起的设备名称, TextData AS 实际执行的SQL语句 FROM fn_trace_gettable(@DefaultTracePath, DEFAULT) WHERE EventClass = 164 -- 对应Object:Altered事件 AND DatabaseName = @TargetDB AND TextData LIKE N'%READ_ONLY%' ORDER BY EventTime DESC; END ELSE BEGIN PRINT N'当前实例未开启默认跟踪,请使用方法2查询'; END
返回结果中,EventTime就是将数据库调整为只读模式的精确时间戳,LoginName就是执行该变更的账号。如果无返回结果,说明操作发生时间过早,跟踪文件已经被滚动覆盖,可尝试方法2。
方法2:通过SQL Server错误日志查询
SQL Server错误日志默认保留最近7份历史日志,会记录所有数据库状态变更的操作信息。
执行以下语句查询,替换你要查询的数据库名称为目标库名称:
-- 第一个参数为日志序号,0代表当前最新日志,1代表上一份,最多可到6 EXEC xp_readerrorlog 0, 1, N'Setting database option READ_ONLY', N'你要查询的数据库名称';
返回结果中的LogDate为操作时间戳,ProcessInfo字段会显示执行操作的登录账号。如果最新日志查不到,可将第一个参数依次修改为1~6,查询更早的历史日志。
内容的提问来源于stack exchange,提问作者Ramkumar Sambandam
相关产品推荐
相关产品推荐

