抓取对某个表的DELETE语句

zhaoanle 2017-01-06 09:06:41
有个数据库表,被多个应用程序使用,经常丢失数据,现在想要查出是哪个程序删除的,

现在用触发器,只能抓到被删除的数据,但是抓不到语句,所以还是无法判断是哪个程序删除的。

有没有办法抓取到对这个表执行的DELETE语句,或者抓到执行DELETE语句的数据库账号也行。

用事件探查器跟踪的话太麻烦了,因为操作很多,这个删除是不定时的,如果长期开着会消耗服务器性能。
...全文
317 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoanle 2017-01-06
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
用一个历史表记录删除日志 e.g.
USE Test
GO
SELECT ID=IDENTITY(INT,1,1),name INTO TriEvent FROM sys.tables
GO
CREATE TABLE TriEventHIST(HostName sysname,IPAddress VARCHAR(50),UserName VARCHAR(50),CreateDate DATETIME DEFAULT GETDATE())
go
CREATE  TRIGGER tr_dTriEvent ON TriEvent
AFTER DELETE
AS

BEGIN
	IF @@ROWCOUNT>0
		INSERT INTO TriEventHIST(HostName,IPAddress,UserName)
		SELECT HOST_NAME(),CAST(CONNECTIONPROPERTY('client_net_address') AS varchar(50)),ORIGINAL_LOGIN() 
END
GO

DELETE TriEvent WHERE ID=1


go
SELECT * FROM TriEventHIST

DROP TABLE dbo.TriEventHIST,TriEvent
感谢,我试试。
zhaoanle 2017-01-06
  • 打赏
  • 举报
回复
引用 1 楼 OrchidCat 的回复:
SELECT    HOST_NAME() + '\' + CURRENT_USER + '\' + APP_NAME() AS loguser;
加到你的触发器里面,获取delete时的工作机器,登录名以及使用什么应用程序.
感谢,我试试。
中国风 2017-01-06
  • 打赏
  • 举报
回复
用一个历史表记录删除日志 e.g.
USE Test
GO
SELECT ID=IDENTITY(INT,1,1),name INTO TriEvent FROM sys.tables
GO
CREATE TABLE TriEventHIST(HostName sysname,IPAddress VARCHAR(50),UserName VARCHAR(50),CreateDate DATETIME DEFAULT GETDATE())
go
CREATE  TRIGGER tr_dTriEvent ON TriEvent
AFTER DELETE
AS

BEGIN
	IF @@ROWCOUNT>0
		INSERT INTO TriEventHIST(HostName,IPAddress,UserName)
		SELECT HOST_NAME(),CAST(CONNECTIONPROPERTY('client_net_address') AS varchar(50)),ORIGINAL_LOGIN() 
END
GO

DELETE TriEvent WHERE ID=1


go
SELECT * FROM TriEventHIST

DROP TABLE dbo.TriEventHIST,TriEvent
Mr_Nice 2017-01-06
  • 打赏
  • 举报
回复
SELECT    HOST_NAME() + '\' + CURRENT_USER + '\' + APP_NAME() AS loguser;
加到你的触发器里面,获取delete时的工作机器,登录名以及使用什么应用程序.

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧