我需要监视一些表以捕获任何数据更改(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
语句文本,而不是实际查询。
我读过,它应该返回查询 - 那么,我做错了什么?
正如评论中提到的,可以使用扩展事件并捕获例如sql_statement_completed
事件来捕获在服务器上成功运行的语句。可以指定过滤器(谓词),以仅捕获insert
语句、update
语句等。
对于此类事件,SQL 将事件信息(以 XML 格式)存储在目标(也必须指定 - 可以是文件)中。该信息包含各种数据,包括触发事件的SQL 语句。
此外,还可以指定要包含的其他信息,例如username。
要通过Edit top 200 rows捕获对表的编辑,还需要捕获rpc_completed
事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句