从触发器主体内放下一个触发器

时间:2018-06-13 17:34:05

标签: mysql

我想在第一次满足条件时运行一次触发器。

要做到这一点,我想从触发器本身的内部放下触发器。我有两个问题:1)有没有比这更好的方法2)如果我把触发器放在触发器体内,会发生什么奇怪的事情吗?

这是我到目前为止所拥有的。对于上下文:还有另一个进程正在运行的东西要完成,在特定情况下它不会写结果,所以在这种情况下我想运行一个脚本,这样当它们全部完成后我想要这个触发器读取另一个表的某些值,然后删除触发器本身,这样它就不会每次都正常运行。

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;

编辑:还有第三个问题," FOR EACH ROW"意思?我只希望触发器运行一次,而不是每行一次。看看文档似乎" FOR EACH ROW"不是可选的。

1 个答案:

答案 0 :(得分:0)

无法在触发器内执行DROP TRIGGER。

要解释原因,首先,DROP TRIGGER会导致隐式提交,其次,提交不会在触发器中发生。详情如下:

  1. DROP TRIGGER导致隐式提交
  2. 见(https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html):

      

    本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就好像您在执行语句之前已完成COMMIT一样。

         

    ...

         

    定义或修改数​​据库对象的数据定义语言(DDL)语句。更改事件,更改功能,更改程序,更改服务器,更改表,更改视图,创建数据库,创建事件,创建功能,创建索引,创建过程,创建角色,创建服务器,创建空间参考系统,创建表,创建触发器,创建视图,DROP DATABASE,DROP EVENT,DROP FUNCTION,DROP INDEX,DROP PROCEDURE,DROP ROLE,DROP SERVER,DROP SPATIAL REFERENCE SYSTEM,DROP TABLE, DROP TRIGGER ,DROP VIEW,INSTALL PLUGIN,RENAME TABLE ,TRUNCATE TABLE,UNINSTALL PLUGIN。

    1. 提交不能在触发器中发生:
    2. 见(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html):

        

      触发器不能使用显式或隐式开始或结束事务的语句,例如START TRANSACTION, COMMIT 或ROLLBACK。 (允许ROLLBACK到SAVEPOINT,因为它不会结束事务。)。