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

我知道删除触发器中没有“ NEW”值,因此不确定是否可行.我正在尝试使用删除前触发器来记录一些值,这很好用,但是如果用户未在where子句中指定任何内容,我也想防止删除任何记录.基本上,我不希望他们擦掉整个桌子. (实际上有代码错误的应用程序开发人员)

目前我有:

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,则可以防止删除和错误?也许只是重新考虑我们如何处理这个问题会更好.感谢您的任何建议.

解决方法:

这确实是开发人员应该犯的一次错误……但是,如果您认为它需要在整个系统范围内,那么这就是正确的解决方法.不需要聪明. (另外,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

(不,我没有弥补).

上一篇:python-Turbogears通过函数调用更改用户


下一篇:MySQL触发器不起作用