• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 触发器

    A.5.1。

    在哪里可以找到MySQL 8.0触发器的文档?

    请参见“触发器语法和示例”。

    A.5.2。

    是否有MySQL触发器的讨论论坛?

    是。可从https://forums.mysql.com/list.php?99获得。

    A.5.3。

    MySQL 8.0是否具有语句级或行级触发器?

    在MySQL 8.0中,所有触发器都是FOR EACH ROW;也就是说,将为插入,更新或删除的每一行激活触发器。MySQL 8.0不支持使用的触发器FOR EACH STATEMENT

    A.5.4。

    是否有任何默认触发器?

    没有明确。对于某些TIMESTAMP列以及使用定义的列, MySQL确实具有特定的特殊行为AUTO_INCREMENT

    A.5.5。

    在MySQL中如何管理触发器?

    在MySQL 8.0中,可以使用CREATE TRIGGER语句创建触发器,并使用删除触发器DROP TRIGGER。有关这些语句的更多信息,请参见“ CREATE TRIGGER语句”和“ DROP TRIGGER语句”。

    通过查询INFORMATION_SCHEMA.TRIGGERS表可以获得有关触发器的信息。请参见“ INFORMATION_SCHEMA TRIGGERS表”。

    A.5.6。

    有没有办法参见给定数据库中的所有触发器?

    是。您可以dbname使用INFORMATION_SCHEMA.TRIGGERS表中的查询(如此处所示)来获得数据库中定义的所有触发器的列表:

    SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT
        FROM INFORMATION_SCHEMA.TRIGGERS
        WHERE TRIGGER_SCHEMA='dbname';
    

    有关此表的更多信息,请参见“ The INFORMATION_SCHEMA TRIGGERS表”。

    您还可以使用SHOW TRIGGERS特定于MySQL 的语句。请参见“ SHOW TRIGGERS语句”。

    A.5.7。

    触发器存储在哪里?

    触发器存储在mysql.triggers系统表中,该表是数据字典的一部分。

    A.5.8。

    触发器可以调用存储过程吗?

    是。

    A.5.9。

    可以触发访问表吗?

    触发器可以访问其自己的表中的旧数据和新数据。触发器也可以影响其他表,但是不允许修改调用该函数或触发器的语句已经在使用(用于读取或写入)的表。

    A.5.10。

    一个表可以有多个具有相同触发事件和动作时间的触发吗?

    在MySQL 8.0中,可以为给定的表定义具有相同触发事件和动作时间的多个触发。例如,BEFORE UPDATE一个表可以有两个触发器。默认情况下,具有相同触发事件和动作时间的触发将按照其创建顺序进行激活。要影响触发器的顺序,请在其后指定一个子句,该子句FOR EACH ROW指示FOLLOWS或,PRECEDES并且还具有相同的触发器事件和动作时间的现有触发器的名称。使用FOLLOWS,新触发器将在现有触发器之后激活。使用PRECEDES,新触发器将在现有触发器之前激活。

    A.5.11。

    触发器可以通过UDF调用外部应用程序吗?

    是。例如,触发器可以调用sys_exec()UDF。

    A.5.12。

    触发器是否可以更新远程服务器上的表?

    是。可以使用FEDERATED存储引擎来更新远程服务器上的表。(请参见“FEDERATED存储引擎”)。

    A.5.13。

    触发器可用于复制吗?

    是。但是,它们的工作方式取决于您使用的是MySQL的“经典”基于语句的复制格式还是基于行的复制格式。

    使用基于语句的复制时,从服务器上的触发器由在主服务器上执行(并复制到从服务器)的语句执行。

    使用基于行的复制时,由于在主服务器上运行然后又复制到从服务器上的语句,因此不会在从服务器上执行触发器。而是在使用基于行的复制时,将在主服务器上执行触发器引起的更改应用于从服务器。

    有关更多信息,请参见“触发器语法”。

    A.5.14。

    如何将通过触发器触发的操作复制到从属设备上?

    同样,这取决于您使用的是基于语句的复制还是基于行的复制。

    基于语句的复制。首先,必须在从服务器上重新创建主服务器上存在的触发器。完成此操作后,复制流程将与参与复制的任何其他标准DML语句一样工作。例如,考虑一个EMP具有AFTER插入触发器的表,该表存在于主MySQL服务器上。从属服务器上也存在相同的EMP表和AFTER插入触发器。复制流程为:

    1. 一个INSERT语句来制作EMP
    2. AFTER触发器EMP触发。
    3. INSERT语句被写入二进制日志。
    4. 复制从站将INSERT语句拾取到EMP并执行该语句。
    5. 从站AFTEREMP存在的触发器被激活。

    基于行的复制。使用基于行的复制时,在主服务器上执行触发器引起的更改将应用于从服务器。但是,在基于行的复制下,触发器本身实际上并未在从属服务器上执行。这是因为,如果主服务器和从属服务器都应用了来自主服务器的更改,并且此外,导致这些更改的触发器应用于从属服务器,则更改实际上将在从属服务器上应用两次,从而导致在主人和奴隶。

    在大多数情况下,基于行的复制和基于语句的复制的结果都是相同的。但是,如果在主服务器和从服务器上使用不同的触发器,则不能使用基于行的复制。(这是因为基于行的格式会将在主服务器上执行的触发器所做的更改复制到从服务器上,而不是将导致触发器执行的语句复制到从服务器上,并且不会执行从服务器上的相应触发器。)相反,任何语句导致执行此类触发器的操作必须使用基于语句的复制进行复制。

    有关更多信息,请参见“触发器语法”。

    上篇:存储过程和函数

    下篇:视图