我希望在第一次满足条件时运行触发器一次,而且只运行一次。
要做到这一点,我想把触发器从触发器本身的身体内。我有两个问题:1)有没有比这更好的方法;2)如果我把扳机扔到扳机体内,会不会发生什么奇怪的事情?
这就是我目前所拥有的。对于context:有另一个进程正在运行,它正在移动要做的事情,在特定的情况下,它不会写入结果,因此在这种情况下,我希望运行一个脚本,当它们都完成时,我希望这个触发器读取另一个表中的一些值,然后删除触发器本身,这样它就不会每次正常完成任务时都运行。
CREATE TRIGGER some_trigger AFTER UPDATE ON table_name FOR EACH ROW
SELECT CASE WHEN ((SELECT count(*) FROM table_name WHERE status!='done') = 0)
THEN BEGIN
UPDATE table_name SET result = (SELECT other.result FROM table_name, other WHERE other.id = table_name.id);
DROP TRIGGER some_trigger;
END;
ELSE BEGIN END;
END CASE;
编辑:还有第三个问题,“每行”是什么意思?我只希望触发器运行一次,而不是每行运行一次。看看文档,似乎“每行”不是可选的。
1条答案
按热度按时间ktecyv1j1#
不能在触发器内执行drop触发器。
首先,解释为什么droptrigger会导致隐式提交,其次,提交不能在触发器中发生。详情如下:
drop触发器导致隐式提交
看到了吗(https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html):
本节中列出的语句(以及它们的任何同义词)隐式地结束当前会话中活动的任何事务,就像您在执行该语句之前执行了提交一样。
...
定义或修改数据库对象的数据定义语言(ddl)语句。alter event,alter function,alter procedure,alter server,alter table,alter view,create database,create event,create function,create index,create procedure,create role,create server,create spatial reference system,create table,create trigger,create view,drop database,drop event,drop function,drop index,drop procedure,drop role,删除服务器,删除空间参考系统,删除表,删除触发器,删除视图,安装插件,重命名表,截断表,卸载插件。
触发器中不能发生提交:
看到了吗(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html):
触发器不能使用显式或隐式开始或结束事务的语句,如start transaction、commit或rollback(允许回滚到保存点,因为它不会结束事务)。