使用扩展事件跟踪表的更新

Eri*_*obb 7 sql-server extended-events sql-server-2014

我有一张不断更新的表,没有人能弄清楚更新的来源。我怀疑它们来自实体框架,但我想通过扩展事件捕获更新和相关信息来证明这个理论。

我正在使用 SQL 2014 Enterprise,并尝试使用 exec_prepared_sql 和 sql_statement_starting 事件捕获该信息。这是我到目前为止所拥有的:

CREATE EVENT SESSION [Query Trace] ON SERVER 
ADD EVENT sqlserver.exec_prepared_sql(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123))),
ADD EVENT sqlserver.sql_statement_starting(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123)))
ADD TARGET package0.event_file(SET filename=N'E:\ExtendedEvent\Query-Trace.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,我已经对其进行了测试,并且能够捕获常规 UPDATE 语句和使用 sp_executesql 调用的语句。但是,我仍然缺少一些东西。表中的数据仍在修改,并且此扩展事件未捕获执行此操作的 UPDATE。

所以,我的问题是:

1) 为了捕获可能来自实体框架的更新,我还需要在扩展事件中观察其他什么吗?

2)为此我应该使用其他什么来代替扩展事件吗?

谢谢!

Nic*_*Nic 9

在使用 SQL Server Enterprise Edition(或运行任何比 2016 SP1 更新的版本)时,我建议使用 SQLAudit 功能。这将为您提供一些关于谁在接触您的表格以及正在执行的命令的详细信息。

对于这样的事情,您可能希望将数据库审计规范服务器审计(用于定义审计将写入的位置)一起使用,然后将其范围缩小到要监视的表。然后确定对公共角色的更改的范围,您将捕获发生的任何和所有更改。

这个脚本应该让你到达那里(在你的开发环境中测试,并替换你想要监控的表的相关部分)。

USE [master]

GO

CREATE SERVER AUDIT [Audit-TblChanges]
TO FILE 
(   FILEPATH = N'C:\SQLAudit'
    ,MAXSIZE = 0 MB
    ,MAX_ROLLOVER_FILES = 2147483647
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(   QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
)

GO

USE [YourDatabase]
GO

CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-MyTable]
FOR SERVER AUDIT [Audit-TblChanges]
ADD (UPDATE ON OBJECT::[YourTable] BY [public]),
ADD (INSERT ON OBJECT::[YourTable] BY [public])

GO


USE [master]
GO
ALTER SERVER AUDIT [Audit-TblChanges] WITH (STATE = ON);

USE [YourDatabase]
GO
ALTER DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-MyTable] WITH (STATE = ON);
GO
Run Code Online (Sandbox Code Playgroud)

您可以使用 GUI 快速读回数据,或者使用sys.fn_get_audit_file直接从 SQL Server 查询数据。

  • 数据库级审核仅在 SQL Server 2016 SP1 之前的企业/开发版中可用。随着 SP1 版本的发布,它们已发生变化,以允许在所有版本中进行数据库审核(编辑答案以包含此新信息) (2认同)