每日删除行

时间:2012-01-03 08:04:33

标签: sql sql-server delete-row

我有一个数据库表,在某个条件下相同的数据会在每天的特定时间丢失,就像执行此类声明一样:

delete * from table where category=1

我想通过SQL脚本列出此表上的所有删除操作,以了解如何准确删除记录以及删除哪个语句,用户和时间。

有没有人有这样的剧本?或者有没有人有类似的案例,可以提出建议吗?

SQL版本是Server 2008 Enterprise Edition。

2 个答案:

答案 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事件探查器(如果可以)。