避免从 table 中删除大量行

Avoid deleting large amount of rows from a table

我发现了很多关于如何从数据库中删除大量数据或如何加速该过程的问答,但没有找到关于如何避免这样做的问题,例如:

我有一个 table 有 10k 行(无论列是什么)。 而不是写

DELETE from tableName WHERE ID=123

某人在编写应用程序时不小心忘记了 where 语句

DELETE from tableName

Which will result in deleting every row from the table (I don't see this an impossible scenario)

更新行也是如此,通过忘记 WHERE 子句,您将更新 table 中的每一行(一开始您甚至不会注意到)

UPDATE tableName set Attribute='new_Value'

前一个实际上是我在编写 windows 应用程序时发生的(幸运的是它只是一个测试数据库

现在我的问题是,我们如何避免做这种事情?

一些想法:

1) 不要将更新和删除权限授予 sa 以外的任何人并写入 SQL 存储 procedures/functions 以更新单行

2)检查update/delete

前有触发器的行数

根据我作为信息系统审计员和风险顾问的经验,我建议通过建立更好的内部控制而不是技术方式来解决这种情况。

我们在大型组织的年度审计期间为他们执行控制保证,其中一个特定的大型主题是关于一般 IT 控制的。这些客户端中的大多数是 public,因此数据对任何潜在的 issues/risks 都很敏感,因此在数据库层:

  1. 我们看看受审计方的 IT 团队是否只授予 需要特定的特权(仅供参考,最小特权原则) 基于他们的工作职能和专业水平的角色——这样没有足够资格的人将没有机会访问如此重要的数据;

  2. 我们还会查看开发人员是否已被授予访问权限 在不应该使用实时数据的生产环境中 - 所有开发工作都应在具有模拟数据的单独环境中执行;

  3. 我们也想看看生产、测试​​、开发环境是否隔离好,不让人访问,update/delete 将数据错误地传输到生产数据库中 到;和

  4. 是否对重要数据进行了定期(每天、每周的冷备份,甚至准备好热备份以备需要时切换)的备份,并进行了适当的审查,以确保它们可以轻松恢复到最新状态点.

作为一名前软件工程师,我知道这可能会有些麻烦,但是是的,"I don't see this an impossible scenario"。