获取由查询引起的数据变化事件的DML查询

米哈乌·图尔钦

我需要监视一些表以捕获任何数据更改(insertupdatedelete查询)。

我尝试在这些事件上创建触发器,但与 DDL 触发器不同,我不能使用eventdata(),它返回发出触发器的确切查询。

有一些解决方法,但没有一个完全满足我的需求。最有希望的是:

use MyDatabase
go

CREATE TRIGGER TestTrigger ON MyDatabase.dbo.TestTable
AFTER INSERT, UPDATE, DELETE  
AS
begin
    SELECT [text]
    FROM sys.dm_exec_requests er
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)
    WHERE session_id = @@SPID
end

但这总是返回create trigger语句文本,而不是实际查询。

我读过,它应该返回查询 - 那么,我做错了什么?

米哈乌·图尔钦

正如评论中提到的,可以使用扩展事件并捕获例如sql_statement_completed事件来捕获在服务器上成功运行的语句。可以指定过滤器(谓词),以仅捕获insert语句、update语句等。

对于此类事件,SQL 将事件信息(以 XML 格式)存储在目标(也必须指定 - 可以是文件)中。该信息包含各种数据,包括触发事件的SQL 语句

此外,还可以指定要包含的其他信息,例如username

要通过Edit top 200 rows捕获对表的编辑,还需要捕获rpc_completed事件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章