SQL Server 2012:查看数据库是否被篡改的方法?

SQL Server 2012:查看数据库是否被篡改的方法?,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,我有一个微妙的情况,数据库中的一些记录莫名其妙地丢失了。每个记录都有一个序列号,该序列跳过整个块。我的服务器程序还保存了一个日志文件,记录所有接收到的事务并将其发布到数据库中,而那些丢失的记录确实会出现在日志中,但不会出现在数据库中。丢失记录的间隔与日志中显示的记录的日期和时间完全一致 该项目目前仍在开发中,由一个服务器程序(由我用Visual Basic 2010编写)组成,运行在我办公室的开发计算机上。该系统通过现场人员的iPhone(运行我开发的专用应用程序)检索数据。数据库位于我们服务器

我有一个微妙的情况,数据库中的一些记录莫名其妙地丢失了。每个记录都有一个序列号,该序列跳过整个块。我的服务器程序还保存了一个日志文件,记录所有接收到的事务并将其发布到数据库中,而那些丢失的记录确实会出现在日志中,但不会出现在数据库中。丢失记录的间隔与日志中显示的记录的日期和时间完全一致

该项目目前仍在开发中,由一个服务器程序(由我用Visual Basic 2010编写)组成,运行在我办公室的开发计算机上。该系统通过现场人员的iPhone(运行我开发的专用应用程序)检索数据。数据库位于我们服务器室的另一台服务器上

除了我之外,没有人可以访问我的开发服务器,它保存着日志文件,但是还有一个人可以完全访问托管数据库的服务器:我们的IT主管,他抱怨说他认为自己应该是这个项目的开发人员

我很难相信他会破坏我的数据,但到目前为止,我看不到其他解释


总之,我的抱怨够了。我需要知道的是,有没有办法确定谁对我的数据库做了什么?

如果事务日志尚未被截断,请查看事务日志:


如果您想实时捕捉这些更改,我建议您考虑使用<代码> Sql从属< /代码>。这样,当数据发生更改时,您将立即收到警报,并可以检查此时哪个用户正在使用数据库(这也可以使用代码完成)

您可以使用代码示例


仔细想想,您可以使用触发器并将ti表写入活动用户来建立相同的效果。当然,如果您怀疑有人在篡改数据,那么使用
SqlDependency
可能是一种更好的方法,因为数据将存储在被篡改的数据库之外。

如果您对“序列号”使用标识,如果insert语句出错,则即使未插入任何记录,标识值仍将递增。除了“篡改”之外,这只是导致此问题的另一个可能原因。

您可以运行跟踪,例如远程探查器跟踪,该跟踪将获取包含
DELETE
关键字的所有SQL查询。这样,没有人会知道查询是跟踪的。您还可以定期查询默认跟踪,以获取最后一个
DELETE
命令:

序列号是如何生成的?有一列记录编号被指定为标识字段,每插入一条记录就递增一次。因为您使用的是SQL Server 2012,这可能会发生:链接:我在写我的文章之前就发现了这一点,它只显示了三行几乎无法辨认的内容,其中包含一大堆“空”单元格。@bill norman-例如,在测试过程中,你启动一个事务,执行几次插入,或者执行其他操作,然后发出回滚以避免更改数据库。这些插入将有一个明显的副作用,即使用标识值。感谢您提供的信息。我在SQL命令中有错误捕获功能,这些命令将错误写入错误日志,我甚至让一些更重要的命令在发生错误时向我发送电子邮件。我从未收到任何电子邮件,并且错误日志中没有与丢失的条目相对应的条目。根据你的评论,没有不受欢迎的记录。谢谢,阿加尼刚才明白你的意思了。这是一种明显的可能性。我将不得不采取另一种方法来解决这个问题。谢谢。我不止一次看到过这个问题,所以我倾向于先排除这个问题。我把这个标记为答案,因为它可能为我省去了很多麻烦。这让我对我最初的担忧产生了足够的怀疑,即追求这个角度是不明智的。如果不知道SQL的这一特性,我可能会出丑。我真的很感激这些信息。SQLDependency功能是一个向后看的功能吗?还是只有在实施后才会启动?换句话说,它会向我展示过去发生的任何交易吗?@BillNorman它不是一个向后看的功能。你可以把它看作是数据库外部触发的触发器。我不知道这是否是你的想法:-但我运行了它,却没有发现那个家伙做了什么。但我不确定这是否就是它的目的。默认跟踪将告诉您最近发生了什么,保持一个运行的探查器会话将告诉您将来会发生什么。正如您所说,您的项目正在开发中,这样您就可以知道将来是否会删除数据,并且它的优点是几乎不留下服务器的任何跟踪:如果有人真的在删除数据,他将不知道跟踪正在运行(他可能知道,但通常人们不会检查,即使他检查,他也不会确定跟踪的目标是跟踪删除)