Mysql 5.6:如何限制更新或删除操作的次数

时间:2017-03-01 04:06:54

标签: mysql

我想要这个......

当更新或删除操作影响大于1000的行数时,禁止。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

没有内置于MySQL的功能可以实现此禁止,自动取消影响超过N行的DML语句(INSERT,UPDATE或DELETE语句)。

对于可以执行的任何和所有可能的INSERT,UPDATE或DELETE语句,实际上并没有实现这种限制的方法。

我们可以采取一些方法来实现这种限制,但所有这些方法都需要一些额外的SQL语句和逻辑。

一种可能性是运行单独的"预检"查询,使用与要发布的UPDATE或DELETE语句相同的条件,并收集将受影响的行数。然后检查返回的计数以确定是否应该发出UPDATE或DELETE。这种方法不对DML语句本身提供任何限制或禁止。这些是需要与实际DML语句分开的额外步骤。

实现此类限制的另一种可能性是在跟踪触发器触发次数的特定表上实现FOR EACH ROW TRIGGER。

触发器需要在用户定义的变量(例如@rowlimit)中递增计数器,并且需要将累积计数器与指定的限制(编码到触发器中)进行比较,然后SIGNAL(当达到或超过指定的限制时,抛出错误。抛出错误将导致操作被取消。

在发出每个INSERT,UPDATE或DELETE语句之前,这种方法还需要一个初步语句来将用户定义的变量重置为零。 SET @rowlimit = 0

请注意,对于通过FOREIGN KEY约束操作受影响的行不会触发触发器,这一点非常重要。要包括这些行的计数,父表上的BEFORE UPDATE / BEFORE DELETE触发器将需要执行查询以查找将在子表中受影响的行数。

为了实现这种限制,对于很多表来说,需要定义很多触发器。

如果我们不禁止 DML语句影响任何行,而是允许DML语句影响最多一定数量的行,并在达到该限制时停止,允许语句成功完成,我们可以在DML语句中添加LIMIT子句。这种方法显然需要修改DML语句,并且不会禁止整个操作。它只指定一个"最大值"行数,以及何时"最大"达到了数字,语句停止处理更多行,留下"最大值"受影响的行数,并成功完成。

禁止影响N行以上的DML语句的唯一方法是完全禁止所有可能影响0行以上的DML语句(y撤销UPDATE,DELETE和INSERT权限。

作为替代方案,我们可以创建MySQL存储程序(即PROCEDURES),它们执行定义良好的更新和删除操作"。这些过程可以定义(DEFINER)在 有权对表执行DML语句的用户的权限下运行。并且可以为其他用户授予这些过程的EXECUTE权限,以便这些用户可以执行定义良好的"更新和删除"操作。

这些方法都不完全满足规范......禁止影响超过指定行数限制的DML操作。