事故中一个简单的愚蠢“UPDATE table SET something=another WHERE (always true)
”很容易破坏数据库中的所有内容。它可能是人为错误,SQL注入/溢出/截断攻击,或构成WHERE原因的代码中的错误。
流行数据库是否提供了一种保护表的功能,限制最大行数可以在一个SQL语句中更新?
我的意思是某种防御性设置适用于数据库上的表前访问权限:无法绕过,编程代码少,没有人为错误(除非授予自己太多访问权限)。
答案 0 :(得分:6)
您可以添加一个触发器来检查正在更新的行数(计算插入的魔术触发器表),以及RAISEERROR(如果行数过多)。
答案 1 :(得分:1)
我什么都不知道。
我不确定这会解决任何问题。数据库如何区分SQL注入攻击和碰巧超出限制的每晚批量更新?
一个假设是自动提交设置为true。如果未提交SQL注入攻击,您总是有机会将其回滚,假设您正在查看日志等。
我认为真正的答案是更好地分层应用,验证,绑定等。如果这些措施到位,你就无法进行SQL注入。
答案 2 :(得分:1)
简短的回答是“不”......
Oracle允许您设置可以分配给用户的define profiles,以限制CPU,逻辑读取等资源的使用。但是,它不是为了您的目的,而是为了在多用户环境中管理资源。
也许更重要的是,它也有flashback table,因此可以轻松撤消意外更改。
大部分场景应该通过其他方式处理:
如果您的数据很重要,则应该对其进行适当的保护并按照上述方式进行处理,并且不需要最大行更新限制;如果您的数据不足以保护,如上所述,那么为什么要担心?
答案 3 :(得分:1)
正如David B首先指出的那样,你可以用触发器做到这一点。无论如何,使用@@ ROWCOUNT测试启动触发器是一个很好的做法。想象一下:
CREATE TRIGGER dbo.trg_myTrigger_UD ON dbo.myTable FOR UPDATE, DELETE
AS
IF @@ROWCOUNT <> 1 RETURN
这会触发任何试图影响多行的更新和/或删除。
作为一般规则,我使用&lt;&gt;的行数测试开始我的0.关键是如果触发器被实际影响没有行的东西拉开(UPDATE表SET col1 ='hey'WHERES 1 = 0)那么在运行触发器代码时没有意义,因为它无论如何都不会做任何事情。
答案 4 :(得分:0)
我理解你的理由,但是你想如何处理合法的批次?
如果您做了一些更改,并且希望能够“撤消”更改,请使用事务。 如果您希望能够重新构建数据,请使用更改存档。 但是,您无法仅从具有100%正确结果的批次创建“这是正确/不正确的批次”检查。
答案 5 :(得分:0)
您只需编写存储过程并仅向用户公开。在正常情况下,您不会在特权账户中工作。只在需要时以管理员身份连接。
答案 6 :(得分:-1)
您可以在事务中包装更新并在提交之前提示用户(让他们知道要更新的行数)。