获取由查询引起的数据更改事件的DML查询

时间:2018-07-17 11:41:10

标签: sql sql-server triggers

我需要监视一些表以便捕获任何数据更改(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语句的文本,而不是实际查询。

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

1 个答案:

答案 0 :(得分:0)

如评论中所述,可以使用扩展事件并捕获例如net461事件来捕获在服务器上成功运行的语句。可以指定一个过滤器(谓词),以仅捕获sql_statement_completed条语句,insert条语句等。

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

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

要通过编辑前200行将编辑内容捕获到表中,还需要捕获update事件。