3

我知道删除触发器中没有“新”值,所以不确定这是否可能。我正在尝试使用删除前触发器来记录一些值,这可以正常工作,但如果用户未在 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,防止删除和错误?也许只是重新考虑我们如何处理这个问题会更好。感谢您的任何建议。

4

1 回答 1

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

(不,我不是在编造这个)。

于 2013-08-28T18:49:09.013 回答