SQL Server 架构完好无损,但每个表中的每条记录都消失了

Kag*_*nar 7 sql-server-2005 sql-server

我们最近设置了一个运行 Windows Server 2008 的新虚拟机,并在其上安装了 SQL Server 2005 的副本。该服务器已经运行并顺利使用了大约两周。我们对它所做的唯一真正维护是移动数据库文件所在的分区(近一周前完成),我们运行了数据库引擎优化顾问,以查看昨天中午 12 点左右对新索引的一些建议。

下午 5 点刚过,软件像往常一样使用时,有人通知我该程序似乎不再正常工作。我检查了数据库,不仅特定于他使用该程序的数据消失了,而且每张大约五十张表的表格似乎都被抹去了所有记录。

在与应用程序开发人员进行了长时间的交谈之后,很明显这不是他们软件的远程可能的功能。

在争先恐后地恢复原状的过程中,我们通过重新启动之间的运行副本克隆了 VM 的备份,从那以后它已经运行了大约一天的时间。因此,我们没有导致问题本身的事件日志。

你以前见过这样的事情吗?(数据库的所有表中的所有记录都......消失了。)有没有人有一个合理的理论来说明这种情况是如何发生的,如果有什么是合理的预防措施呢?

Nic*_*mas 14

这发生在我的公司。

有人从应用程序的管理界面内重新运行模式创建脚本——类似于“初始化数据库”命令。这些脚本包括一系列IF EXISTS()...DROP...CREATE用于删除和重新创建每个表和约束的语句。由于它们旨在擦除数据库,即使它已经被填充,它们被精心构建以考虑外键关系。因此,数据库模式在那里并且看起来很棒,但是所有数据都不见了。

为防止出现这种情况,请在应用程序创建自己的架构后从应用程序的数据库登录中撤消相应的 DDL 权限,或者确保您的应用程序具有的任何“初始化数据库”功能都包含多项安全检查,并向用户提供有关即将发生的事情的适当警告.


gbn*_*gbn 11

每桌?这是故意破坏或愚蠢。这不是 SQL Server 问题

至少有3种方式:

  • 不带 WHERE 子句的 DELETE
  • 截断表
  • 删除表后创建表

如果你有外键,那么就不可能使用 TRUNCATE TABLE 并且使用 DELETE 更棘手。您必须多次通过 DELETE。DROP/CREATE TABLE 同上

没有 WHERE 的 DELETE 很容易在您的应用程序中使用动态 SQL,并且一些 WHERE 逻辑通过 NULL 连接被删除。

DROP/CREATE 和 TRUNCATE TABLE 也需要非常高级别的权限。

概括。一项或多项:

  • 安全性差
  • 没有外键
  • 不知情的开发商

编辑:设计不当的触发器或 FK 可能会很快擦除几个表

  • 可能的第四种方式:如果有外键并且它们是使用“on delete cascade”子句创建的,那么(取决于数据库设计)从错误的表中删除没有 where 子句可以清除整个数据库。我将其称为“设计不佳的外键”的摘要。 (5认同)