我有一张桌子,我们称之为myTbl
。
我还有两个表 - Monitor
和Monitor_bkp
。
现在我构建了一个触发器,只要是myTbl
中的更新,就会在Monitor中创建一个新行:
CREATE TRIGGER mon_task_after_update_task
AFTER UPDATE ON myTbl
FOR EACH ROW INSERT INTO Monitor VALUES(new.id, SYSDATE())
ON DUPLICATE KEY UPDATE last_modified=SYSDATE();
一切正常,我对myTbl
的任何时候都有很多更新。
现在我的问题是,如果我使用
Monitor
和Monitor_bkp
的名称
RENAME TABLE foo TO foo_old, foo_new To foo;
交换进行时触发器是否有可能触发,如果是,它会失败?
答案 0 :(得分:2)
根据the manual(以及我使用此功能进行日志轮换的经验),操作是原子操作,尝试使用该表的线程必须等待RENAME TABLE
完成。
这也意味着RENAME TABLE
将等待触及表的所有事务完成,并且在等待它时将锁定尝试触摸表的每个后续事务。
基本上一切都会在交换期间的最长交易期间冻结,但会保持一致。
答案 1 :(得分:0)
正如Vatev已经提到的那样,触发器不会触发。
如果您仍然对此感到焦虑(或任何其他用途),您可能需要在程序逻辑中添加用户定义的变量(例如@ALLOW_TRIGGER
)并在触发器中检查其值:
DELIMITER $$
myTrigger: BEGIN
IF (@ALLOW_TRIGGER = FALSE)
THEN
LEAVE myTrigger
END;
# rest of trigger logic
END $$
DELIMITER ;