在删除mysql之前触发,如果没有where子句则阻止删除?

时间:2013-08-28 18:32:12

标签: mysql triggers

我知道删除触发器中没有“NEW”值,所以不确定这是否可行。我试图使用删除前触发器来记录一些值,这工作正常,但我还想防止删除任何记录,如果用户没有在where子句中指定任何内容。基本上,我不希望他们擦掉整个桌子。 (app devs实际上有代码错误)

目前我有:

delimiter $$
create trigger tg_order_shipping_bd
before delete on order_shipping
FOR EACH ROW
begin

        insert into order_shipping_log
        (log_type, inv_nbr, old_tracking_nbr)
        values ( 'DEL', OLD.inv_nbr, OLD.tracking_nbr);

end
$$

那么有一种聪明的方法来计算受影响的行,如果超过1,则会阻止删除和错误吗?也许只是重新思考我们如何处理这个问题更好。谢谢你的任何建议。

1 个答案:

答案 0 :(得分:3)

这真是一个开发人员应该只犯一次的错误......但是,如果您认为它需要在整个系统范围内,这是正确的解决方案。不需要聪明。 (此外,MySQL中的触发器是FOR EACH ROW所以你的问题的答案是“不是真的”,尽管你可以通过巧妙地使用会话变量或两个来破解它。

MySQL有一个名为sql_safe_updates的系统变量。

mysql> SET GLOBAL sql_safe_updates = 1;
Query OK, 0 rows affected (0.00 sec)

断开连接并重新连接,以便您的会话获取新的全局值。

mysql> delete from t1;
ERROR 1175 (HY000): You are using safe update mode and you tried to update
                    a table without a WHERE that uses a KEY column

使用命令行客户端时,您可以仅为具有此标志的会话暂时启用此设置:

$ mysql --i-am-a-dummy

(不,我不是这样做的。)