我需要监视一些表以便捕获任何数据更改(insert
,update
,delete
查询)。
我尝试在这些事件上创建触发器,但是与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
语句的文本,而不是实际查询。
我已经读过,它应该返回查询-那么,我在做什么错了?
答案 0 :(得分:0)
如评论中所述,可以使用扩展事件并捕获例如net461
事件来捕获在服务器上成功运行的语句。可以指定一个过滤器(谓词),以仅捕获sql_statement_completed
条语句,insert
条语句等。
在发生此类事件的情况下,SQL将事件信息(XML格式)存储在目标中(也必须指定-可以是文件)。此信息包含触发事件的包括SQL语句在内的各种数据。
此外,还可以指定要包含的其他信息,例如用户名。
要通过编辑前200行将编辑内容捕获到表中,还需要捕获update
事件。