我有一个数据库表,在某个条件下相同的数据会在每天的特定时间丢失,就像执行此类声明一样:
delete * from table where category=1
我想通过SQL脚本列出此表上的所有删除操作,以了解如何准确删除记录以及删除哪个语句,用户和时间。
有没有人有这样的剧本?或者有没有人有类似的案例,可以提出建议吗?
SQL版本是Server 2008 Enterprise Edition。
答案 0 :(得分:1)
使用表上的AFTER DELETE
触发器记录另一个表中删除的用户及执行时间。
使用一些高级技巧,您可以提取删除行的查询文本,但我不确定它是否可以在触发器内。
触发器可能如下所示
CREATE TABLE YourLogTable
(
ID int identity primary key,
Date datetime NOT NULL DEFAULT GETDATE(),
[User] nvarchar(128) NOT NULL DEFAULT suser_sname(),
[SqlText] NVARCHAR(MAX),
[any other interesting columns from deleted rows]
)
GO
CREATE TRIGGER [TR.AD@YourTable]
ON YourTable
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sqlText NVARCHAR(MAX)
SELECT @sqlText = txt.Text
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) txt
WHERE session_id = @@SPID
INSERT YourLogTable([SqlText], [any other interesting columns from deleted rows])
SELECT @SqlText, [any other interesting columns from deleted rows]
FROM DELETED
END
答案 1 :(得分:1)
如果这只是一个短期调试问题,解决此问题的最简单方法可能是运行SQL Server Profiler,过滤器设置为捕获您感兴趣的数据。没有代码改变这种方式。
为获得最佳性能,请尝试在除DB服务器之外的计算机上运行SQL事件探查器(如果可以)。