数据神秘地从sql server表中消失

数据神秘地从sql server表中消失,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我们在SQLServer2008R2上有数据库,一个表中的数据不时神秘地消失。数据是通过web应用程序调用数据库中的存储过程插入的。在用户输入数据并保存后,由于业务逻辑,他必须打印这些数据。但正如我之前所说,有时数据会从有20列的表中消失;有一列(我们称之为id_列)是PK,并且在上具有identity(1,1)属性。在检查表中的数据后,我们注意到id_列值之间的间隙,例如:100、101、102、103、106…所以缺少104和105。在那个些id-s上应该是缺失的数据,我们知道它们在那个里,

我们在SQLServer2008R2上有数据库,一个表中的数据不时神秘地消失。数据是通过web应用程序调用数据库中的存储过程插入的。在用户输入数据并保存后,由于业务逻辑,他必须打印这些数据。但正如我之前所说,有时数据会从有20列的表中消失;有一列(我们称之为id_列)是PK,并且在上具有identity(1,1)属性。在检查表中的数据后,我们注意到id_列值之间的间隙,例如:100、101、102、103、106…所以缺少104和105。在那个些id-s上应该是缺失的数据,我们知道它们在那个里,因为我们已经打印了报告。我们在此表上设置了instead delete触发器,但未捕获已删除的行。我们还恢复了发生时的日志备份,但日志文件中没有删除操作。你能帮我解释一下它们是如何消失的,以及如何防止这种情况发生吗?提前感谢。

如果事务已启动但随后回滚,则ID中会出现空白。
如果delete触发器没有触发,并且您在事务日志中没有看到delete,我会说delete从未发生过。但是回滚是可能的。

如果事务启动后又回滚,则ID中会有间隙。

如果delete触发器没有触发,并且您在事务日志中没有看到delete,我会说delete从未发生过。但是回滚是可能的。

数据库是镜像的还是复制的?如果是,什么类型?否,既不镜像也不复制…on delete触发器的作用是什么?您是否有任何计划的作业扰乱了数据,或者可能是不满的员工?
IDENTITY
列可能在序列中包含间隙。您不应该关心这个或数值。如果你真的在意,那你就是在滥用它们。数据库是镜像的还是复制的?如果是,什么类型?否,既不镜像也不复制…on delete触发器的作用是什么?您是否有任何计划的作业扰乱了数据,或者可能是不满的员工?
IDENTITY
列可能在序列中包含间隙。您不应该关心这个或数值。如果您真的在意,您就是在误用它们。是的,这是合乎逻辑的…我们在存储过程中使用它来保存数据。尝试…捕获,如果插入出错,事务回滚…但在这种情况下,数据不会保存到表中,并且我们已经打印了它们存在的证据..或者其他什么回滚事务?知道谁和如何保存数据吗?实际上数据将保存到表中(至少从同一个连接看),如果在事务处于活动状态但未提交的情况下从同一个数据库连接进行打印,那么您的场景是完全可能的。@Arvo好吧,您是对的……如何防止这种情况发生?@Arvo这不一定是真的。不能在同一事务中插入和选择数据,除非存在显式事务,并且这些是不同的步骤以及SELECT执行回滚之后的内容。不太可能。唯一可以解释缺少行但显示在报表上的是通过NOLOCK或READ UNCOMMIT隔离级别进行脏读。@srutzky正确,我忘记了使用NOLOCK提示进行报表-这比使用显式事务的场景更可能发生。顺便说一句,我在我们的桌面软件(从开始到结束都使用相同的SQL连接)中看到过这种显式事务——一个错误的脚本启动了事务,但没有结束它;所有这些看起来都很酷——我创建了新文档,打印了这些文档,关闭了应用程序,又重新启动了它——在SQL或我们的应用程序中都没有上述文档的痕迹。ID当然增加了。是的,这是合乎逻辑的…我们在存储过程中使用它来保存数据尝试…捕获,如果插入出错,事务回滚…但在这种情况下,数据不会保存到表中,我们已经打印了它们存在的证据..或者其他什么回滚事务?知道谁和如何保存数据吗?实际上数据将保存到表中(至少从同一个连接看),如果在事务处于活动状态但未提交的情况下从同一个数据库连接进行打印,那么您的场景是完全可能的。@Arvo好吧,您是对的……如何防止这种情况发生?@Arvo这不一定是真的。不能在同一事务中插入和选择数据,除非存在显式事务,并且这些是不同的步骤以及SELECT执行回滚之后的内容。不太可能。唯一可以解释缺少行但显示在报表上的是通过NOLOCK或READ UNCOMMIT隔离级别进行脏读。@srutzky正确,我忘记了使用NOLOCK提示进行报表-这比使用显式事务的场景更可能发生。顺便说一句,我在我们的桌面软件(从开始到结束都使用相同的SQL连接)中看到过这种显式事务——一个错误的脚本启动了事务,但没有结束它;所有这些看起来都很酷——我创建了新文档,打印了这些文档,关闭了应用程序,又重新启动了它——在SQL或我们的应用程序中都没有上述文档的痕迹。ID当然增加了。