我有几个触发器,可以自动更新发票数据并在数据库中设置一些状态。
但是,如果有2个触发器的变量名相同,则当一个触发器执行更新而另一个触发器运行时,它们会被覆盖。
例如,
在支付表中插入前触发器设置变量@amountPaid
SET @amountPaid = @totalPayments + NEW.amount有时,在付款前插入将触发对主记录的更新,该记录触发main触发器,该触发器为自己的条件在@amountPaid中选择总支付。但是,从这个角度来看,@amountPaid是0,因为important还没有完成,但这并不重要。非常奇怪的是,支付触发器中的@amountPaid变量现在是0。
所以现在我很好奇在MySQL中范围是如何工作的?
发布于 2015-02-13 18:58:22
这取决于变量的范围。
我曾经写过一个post 仅禁用一个表的触发器,它使用一个名为@TRIGGER_DISABLED的变量。
为了使变量禁用触发器,会话必须在表的任何SET @TRIGGER_DISABLED=0;或SET @TRIGGER_DISABLED=1;之前实例化值DML。如果断开和重新连接,则必须在每次重新连接时实例化该变量。
在您的示例中,当DB会话开始时,@amountPaid和@totalPayments必须在执行任何操作之前设置为0。如果您一直在运行总计,则无法断开和重新连接。
如果您总是断开和重新连接,则可以将正在运行的总计存储在一个全局表中,该表使用内存存储引擎和您选择的会话ID。
https://dba.stackexchange.com/questions/91920
复制相似问题