代码之家  ›  专栏  ›  技术社区  ›  Dennis C

是否可以在sql数据库级别阻止批处理更新?

  •  1
  • Dennis C  · 技术社区  · 16 年前

    一个简单的傻瓜” UPDATE table SET something=another WHERE (always true)

    流行的数据库是否提供了通过限制一条SQL语句中可以更新的最大行数来保护表的功能?

    我指的是某种防御性的设置,适用于数据库上的预表访问权:无法绕过,编程代码更少,没有人为错误(除非授予自己太多的访问权)。

    7 回复  |  直到 16 年前
        1
  •  6
  •   Amy B    16 年前

    您可以添加一个触发器来检查有多少行正在更新(计算插入的魔法触发器表),如果太多行,则可以提高错误率。

        2
  •  1
  •   duffymo    16 年前

    我什么都不知道。

    我不确定这能解决什么问题。数据库如何区分SQL注入攻击和碰巧超出您限制的夜间批处理更新?

    我认为真正的答案是更好地分层应用程序、验证、绑定等。如果这些措施到位,就无法进行SQL注入。

        3
  •  1
  •   Community Nick Dandoulakis    4 年前

    Oracle允许您设置定义 profiles

    也许更重要的是,它也有 flashback table 因此,意外更改可以轻松撤消。

    您的大多数场景都应该通过其他方式处理:

    • 把桌子放下
    • 注射攻击:可以而且应该防止这些攻击的发生
    • 代码错误:应该通过适当的测试来发现这些错误

        4
  •  1
  •   Eric Sabine    16 年前

    正如David B首先指出的,你可以用触发器来实现这一点。无论如何,用@@ROWCOUNT测试来启动触发器是一种很好的做法。想象一下:

    CREATE TRIGGER dbo.trg_myTrigger_UD ON dbo.myTable FOR UPDATE, DELETE
    AS
    IF @@ROWCOUNT <> 1 RETURN
    

    一般来说,我从<&燃气轮机;0关键是,如果触发器是由实际上不影响任何行的某个东西启动的(更新表集col1='hey',其中1=0),那么运行触发器代码就没有意义了,因为它不会做任何事情。

        5
  •  0
  •   TcKs    16 年前

    如果您手动进行一些更改,并且希望能够“撤消”这些更改,请使用事务。 如果您希望能够重新构建数据,请使用更改存档。

        6
  •  0
  •   Ken Yao    16 年前

    您只需要编写存储过程,并且只向用户公开这些存储过程。在正常情况下,你不会在私人账户中工作。仅在需要时以管理员身份连接。

        7
  •  -1
  •   Jim Anderson    16 年前