A.5 MySQL 5.7 FAQ:触发器


**A.5.1. **
在哪里可以找到 MySQL 5.7 触发器的文档?
See 第 23.3 节“使用触发器”.

**A.5.2. **
是否有 MySQL 触发器的讨论论坛?
是。在https://forums.mysql.com/list.php?99可用。

**A.5.3. **
MySQL 5.7 是否具有语句级或行级触发器?
在 MySQL 5.7 中,所有触发器都是FOR EACH ROW;也就是说,将为插入,更新或删除的每一行激活触发器。 MySQL 5.7 不支持使用FOR EACH STATEMENT的触发器。

**A.5.4. **
是否有任何默认触发器?
没有明确。对于某些TIMESTAMP列以及使用AUTO_INCREMENT定义的列,MySQL 确实具有特定的特殊行为。

**A.5.5. **
如何在 MySQL 中 Management 触发器?
在 MySQL 5.7 中,可以使用CREATE TRIGGER语句创建触发器,并使用DROP TRIGGER删除触发器。有关这些语句的更多信息,请参见第 13.1.20 节“ CREATE TRIGGER 语句”第 13.1.31 节“ DROP TRIGGER 语句”
有关触发器的信息可以通过查询INFORMATION_SCHEMA.TRIGGERStable 获得。参见第 24.29 节“ INFORMATION_SCHEMA TRIGGERStable”

**A.5.6. **
是否可以查看给定数据库中的所有触发器?
是。您可以使用对INFORMATION_SCHEMA.TRIGGERStable 的查询(如此处所示)来获得数据库dbname上定义的所有触发器的列 table:
SELECT TRIGGER_NAME,EVENT_MANIPULATION,EVENT_OBJECT_TABLE,ACTION_STATEMENT
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA='dbname';
有关此 table 的更多信息,请参见第 24.29 节“ INFORMATION_SCHEMA TRIGGERStable”
您还可以使用特定于 MySQL 的SHOW TRIGGERS语句。参见第 13.7.5.38 节“ SHOW TRIGGERS 语句”

**A.5.7. **
触发器存储在哪里?
触发器存储在.TRG个文件中,每个 table 一个这样的文件。

**A.5.8. **
触发器可以调用存储过程吗?
Yes.

**A.5.9. **
可以触发访问 table 吗?
触发器可以访问其自己的 table 中的旧数据和新数据。触发器也可以影响其他 table,但是不允许修改已被调用函数或触发器的语句使用的 table(用于读取或写入)。

**A.5.10. **
一个 table 可以有多个具有相同触发事件和动作时间的触发吗?
可以为给定的 table 定义具有相同触发事件和动作时间的多个触发。例如,一个 table 可以有两个BEFORE UPDATE触发器。默认情况下,具有相同触发事件和动作时间的触发器将按照其创建 Sequences 进行激活。要影响触发 Sequences,请在FOR EACH ROW之后指定一个子句,该子句指示FOLLOWSPRECEDES,以及一个现有触发器的名称,该触发器也具有相同的触发事件和动作时间。使用FOLLOWS,新触发器将在现有触发器之后激活。使用PRECEDES,新触发器将在现有触发器之前激活。

**A.5.11. **
触发器可以通过 UDF 调用外部应用程序吗?
是。例如,触发器可以调用sys_exec() UDF。

**A.5.12. **
触发器是否可以更新远程服务器上的 table?
是。可以使用FEDERATED存储引擎来更新远程服务器上的 table。 (请参见第 15.8 节“联邦存储引擎”)。

**A.5.13. **
触发器可用于复制吗?
是。但是,它们的工作方式取决于您使用的是 MySQL 的“经典”基于语句的复制格式还是基于行的复制格式。
使用基于语句的复制时,从服务器上的触发器由在主服务器上执行(并复制到从服务器)的语句执行。
使用基于行的复制时,由于在主服务器上运行然后又复制到从服务器上的语句,因此不会在从服务器上执行触发器。而是在使用基于行的复制时,将在主服务器上执行触发器引起的更改应用于从服务器。
有关更多信息,请参见第 16.4.1.34 节,“复制和触发器”

** A.5.14. *
如何将通过触发器触发的操作复制到从属设备上?
再次,这取决于您使用的是基于语句的复制还是基于行的复制。
基于语句的复制. 首先,必须在从服务器上重新创建主服务器上存在的触发器。完成此操作后,复制流程将与参与复制的任何其他标准 DML 语句一样工作。例如,考虑一个具有AFTER插入触发器的 tableEMP,该 table 存在于主 MySQL 服务器上。从属服务器上也存在相同的EMPtable 和AFTER插入触发器。复制流程为:
EMP做出了INSERT声明。
EMP上的AFTER触发器将激活。
INSERT语句被写入二进制日志。
复制从站将INSERT语句拾取到EMP并执行它。
从站上存在的EMP上的AFTER触发器被激活。
基于行的复制. 当您使用基于行的复制时,在主服务器上执行触发器引起的更改将应用于从服务器。但是,在基于行的复制下,触发器本身实际上并未在从属服务器上实际执行。这是因为,如果主设备和从设备都应用了来自主设备的更改,此外,导致这些更改的触发器也应用于从设备,则更改实际上将在从设备上应用两次,从而导致不同的数据通过主人和奴隶。
在大多数情况下,基于行的复制和基于语句的复制的结果都是相同的。但是,如果在主服务器和从服务器上使用不同的触发器,则不能使用基于行的复制。 (这是因为基于行的格式会将在主服务器上执行的触发器所做的更改复制到从服务器上,而不是将导致触发器执行的语句复制到从服务器上,并且不会执行从服务器上的相应触发器.)相反,任何语句导致执行此类触发器的操作必须使用基于语句的复制进行复制。
有关更多信息,请参见第 16.4.1.34 节,“复制和触发器”