Mur*_*han 7 sql-server locking
就我而言,有一个由多个团队使用的 SQL Server 数据库。数据库突然进入单用户模式。现在,如何识别执行此操作的负责用户或应用程序?它也可以是一个应用程序。
如果现在不可能,那么将来该怎么做才能捕获这些信息呢?
Aar*_*and 13
spid记录在SQL Server错误日志中,但不记录用户/应用程序/主机。而且,正如 Grant 提到的,内置system_health
会话(或默认跟踪,如果您仍然启用了该功能)中不会记录任何内容。
EXEC sys.sp_readerrorlog 0, 1, 'single_user';
Run Code Online (Sandbox Code Playgroud)
结果:
EXEC sys.sp_readerrorlog 0, 1, 'single_user';
Run Code Online (Sandbox Code Playgroud)
为了将来捕获此信息,您可以设置扩展事件会话,例如
CREATE EVENT SESSION [CatchAlterDatabase] ON SERVER
ADD EVENT sqlserver.object_altered
(
ACTION
(
sqlserver.client_app_name, sqlserver.client_hostname,
sqlserver.server_principal_name, sqlserver.sql_text
) WHERE ([object_type] = 'DATABASE')
)
ADD TARGET package0.event_file
(
SET filename = N'CatchAlterDB.xel',
max_file_size=(25), max_rollover_files=(10)
)
WITH
(
MAX_MEMORY=4096 KB, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS, MAX_EVENT_SIZE=0 KB,
TRACK_CAUSALITY=OFF,STARTUP_STATE=ON
);
GO
ALTER EVENT SESSION CatchAlterDatabase ON SERVER STATE = START;
Run Code Online (Sandbox Code Playgroud)
右键单击“管理”>“扩展事件”>“会话”下的会话,然后选择“观看实时数据”(或转到事件文件并选择“查看目标数据...”),您可以看到类似这样的事件(请注意,目标数据库实际上列出了object_name
;下database_name
是上下文数据库):
但您还将获得所有其他更改数据库事件。我将把它作为练习留给读者使用sys.fn_xe_file_target_read_file
(docs here)以编程方式提取数据(和过滤) 。Grant Fritkey在此提出了一个入门查询。
还有其他选项,例如SQL Server Audit / DATABASE_OBJECT_CHANGE_GROUP
。
现代 SQL Server 版本将允许您创建服务器安全审核。它们有点像扩展活动,但更精简。
设置 SQL Server 安全审核的基本脚本可能如下所示:
USE [master]
GO
/****** Object: Audit [ServerSecurityAudit2021] Script Date: 03.03.2021 12:39:07 ******/
CREATE SERVER AUDIT [ServerSecurityAudit2021]
TO FILE
( FILEPATH = N'E:\MSSQL13.INSTANCENAME\MSSQL\Log\'
,MAXSIZE = 256 MB
,MAX_FILES = 10
,RESERVE_DISK_SPACE = OFF
)
WITH
( QUEUE_DELAY = 1000
,ON_FAILURE = CONTINUE
)
Run Code Online (Sandbox Code Playgroud)
USE [master]
GO
CREATE SERVER AUDIT SPECIFICATION [ServerSecurityAuditSpecs2021]
FOR SERVER AUDIT [ServerSecurityAudit2021]
ADD (DATABASE_CHANGE_GROUP),
ADD (FAILED_LOGIN_GROUP)
-- , ADD (USER_CHANGE_PASSWORD_GROUP)
-- , ADD (SERVER_PERMISSION_CHANGE_GROUP)
-- , ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP)
-- , ADD (LOGIN_CHANGE_PASSWORD_GROUP)
WITH (STATE = ON)
GO
Run Code Online (Sandbox Code Playgroud)
我注释掉了一些 SQL Server 审核操作组和操作。可以在SQL Server 审核操作组和操作(Microsoft | SQL 文档)下找到其列表
ALTER SERVER AUDIT [ServerSecurityAudit2021] WITH (STATE = ON)
GO
Run Code Online (Sandbox Code Playgroud)
参考: CREATE SERVER AUDIT (Transact-SQL)(Microsoft | SQL 文档)
您可以按照创建服务器审核和数据库审核规范(Microsoft | SQL 文档)中概述的步骤对 SSMS 执行相同的操作。
在实例的 SSMS 中,导航到安全 | 审计| Your_Audit_Name,右键单击审核并选择查看审核日志。
然后,您可以选择“更改操作 ID”,它将显示所发生事件的详细信息。
编辑细节以保护无辜者