查找删除或更新记录

kdi*_*dis 7 sql-server-2005 audit dml

最近几个月我发生了三起事件,其中表中的记录已被删除或整个表中的值更新为零。我们有一个由四人组成的团队,他们拥有权限并负责更新本可以执行此操作的数据库。令人失望的是,没有人承认进行了这些更改。

展望未来,我希望能够记录这些交易。我想知道其他人用什么来跟踪这些变化?他们使用跟踪更改的软件还是创建存储过程或跟踪文件?如果有人在他们的设施中设置了这个,我想知道他们使用什么。跟踪文件确实有我想要的信息,例如登录名机器号和 sql 语句,因此如果我提前设置它们,它将为我提供信息。

当这些更改发生时,我有数据库和事务日志的副本。我能用这些旧文件做些什么来帮助追查罪魁祸首吗?预先感谢任何回复的人。我们使用的是 SQL Server 2005。

Stu*_*ore 5

fn_dblog 正如其他评论员所说,是向后看的方式。

只允许用户通过存储过程修改数据是防止这种情况发生的好方法,因为您可以添加逻辑来防止用户大量修改他们不应该修改的记录,或者确保他们必须提供正确的值更新。这可能意味着您需要根据应用程序当前访问数据的方式进行更改。这对您来说可能或不可能。

如果您不能这样做,那么使用 SQL 2005 的一种快速而简单的方法是使用触发器在表级别进行一些 DML 审计。(SQL Server 2008 以后有内置的审计工具)。

您的问题的简单解决方案可能是:


drop table audit_test
go
create table audit
(
uname varchar(50),
[date] datetime,
what nvarchar(4000),
host varchar(50),
)
go 

create trigger ddlcheck on tbl_example 
for update, delete
as
declare @tbltmp table(eventtype nvarchar(30),para smallint, strsql nvarchar(4000))
insert into @tbltmp exec ('dbcc inputbuffer('+@@spid+')')
insert into audit_test select SUSER_NAME(), GETDATE(),  strsql ,  HOST_NAME() from @tbltmp
Run Code Online (Sandbox Code Playgroud)

这将在查询尝试更新表或从表中删除时触发。它使用DBCC inputbufferhttp://msdn.microsoft.com/en-us/library/ms187730(v=sql.90).aspx)来获取发出的命令。这为您提供了一个表,其中填充了针对特定表发出的所有更新和删除语句。此外,它还记录了谁发布了声明,以及声明的时间和地点。

现在,这可能是繁忙表上的大量日志记录数据,因此可以将触发器更改为:


create trigger ddlcheck on tbl_example 
for update, delete
as
declare @cnt integer
select @cnt=count(1) from deleted
if @cnt>1000
begin
  declare @tbltmp table(eventtype nvarchar(30),para smallint, strsql nvarchar(4000))
  insert into @tbltmp exec ('dbcc inputbuffer('+@@spid+')')
  insert into audit_test select SUSER_NAME(), GETDATE(),  strsql ,  HOST_NAME() from @tbltmp
end
Run Code Online (Sandbox Code Playgroud)

这会记录较少的数据,但触发器仍需要为每个操作“评估”,因此可能会对性能产生影响,需要对其进行测量和测试。如果用户提交大量单独的语句,这也会错过操作,即;

不会抓住:


delete from tbl_example where id=1
delete from tbl_example where id=2
.....
delete from tbl_exampe where id=1000
Run Code Online (Sandbox Code Playgroud)

会抓住


delete from tbl_example where id>0 and id<1001
Run Code Online (Sandbox Code Playgroud)

希望这对未来有一些帮助。