## A.5 MySQL 8.0 常见问题解答：触发器

[](<>)A.5.1。[在哪里可以找到 MySQL 8.0 触发器的文档？](faqs-triggers.html#faq-mysql-where-triggers-docs)A.5.2。[是否有 MySQL 触发器的讨论论坛？](faqs-triggers.html#faq-mysql-where-triggers-forum)A.5.3. [MySQL 8.0 有语句级或行级触发器吗？](faqs-triggers.html#faq-mysql-have-trigger-levels)A.5.4。[是否有任何默认触发器？](faqs-triggers.html#faq-mysql-have-trigger-defaults)A.5.5。[MySQL 中的触发器是如何管理的？](faqs-triggers.html#faq-mysql-how-triggers-managed)A.5.6。[有没有办法查看给定数据库中的所有触发器？](faqs-triggers.html#faq-mysql-can-view-all-triggers)A.5.7. [触发器存储在哪里？](faqs-triggers.html#faq-mysql-how-triggers-stored)A.5.8。[触发器可以调用存储过程吗？](faqs-triggers.html#faq-mysql-can-trigger-procedure)A.5.9。[触发器可以访问表吗？](faqs-triggers.html#faq-mysql-can-triggers-tables)A.5.10。[一个表可以有多个触发器具有相同的触发事件和动作时间吗？](faqs-triggers.html#faq-mysql-can-triggers-same-events)A.5.11。[触发器是否可以更新远程服务器上的表？](faqs-triggers.html#faq-mysql-can-triggers-remote)A.5.12。[触发器是否适用于复制？](faqs-triggers.html#faq-mysql-can-triggers-replication)A.5.13。[如何通过将源上的触发器复制到副本来执行操作？](faqs-triggers.html#faq-mysql-how-triggers-source-replica)

| [](<>)[](<>)<br/><br/>**A.5.1。** | 在哪里可以找到 MySQL 8.0 触发器的文档？ |
| :------------------------------- | :------------------------ |
|  | 看[第 25.3 节，“使用触发器”](triggers.html). |
| [](<>)[](<>)<br/><br/>**A.5.2。** | 是否有 MySQL 触发器的讨论论坛？ |
|  | 是的。可在<https://forums.mysql.com/list.php?99>. |
| [](<>)[](<>)<br/><br/>**A.5.3.** | MySQL 8.0 有语句级或行级触发器吗？ |
|  | 在 MySQL 8.0 中，所有触发器都是`每一行`;也就是说，触发器会为插入、更新或删除的每一行激活。MySQL 8.0 不支持使用触发器`对于每个声明`. |
| [](<>)[](<>)<br/><br/>**A.5.4。** | 是否有任何默认触发器？ |
|  | 不明确。MySQL 确实对某些特定的特殊行为[`时间戳`](datetime.html)列，以及使用定义的列`自动递增`. |
| [](<>)[](<>)<br/><br/>**A.5.5。** | MySQL 中的触发器是如何管理的？ |
|  | 在 MySQL 8.0 中，可以使用[`创建触发器`](create-trigger.html)声明，并删除使用[`下降触发器`](drop-trigger.html).看[第 13.1.22 节，“CREATE TRIGGER 语句”](create-trigger.html)， 和[第 13.1.34 节，“DROP TRIGGER 语句”](drop-trigger.html), 有关这些陈述的更多信息。<br/><br/>可以通过查询获取有关触发器的信息[`INFORMATION_SCHEMA.TRIGGERS`](information-schema-triggers-table.html)桌子。看[第 26.3.45 节，“信息\_SCHEMA 触发器表”](information-schema-triggers-table.html). |
| [](<>)[](<>)<br/><br/>**A.5.6。** | 有没有办法查看给定数据库中的所有触发器？ |
|  | 是的。您可以获得数据库上定义的所有触发器的列表`数据库名称`使用查询[`INFORMATION_SCHEMA.TRIGGERS`](information-schema-triggers-table.html)如下所示的表：<br/><br/>`<br/>选择TRIGGER_NAME、EVENT_MANIPULATION、EVENT_OBJECT_TABLE、ACTION_STATEMENT<br/>来自INFORMATION_SCHEMA.TRIGGERS<br/>其中TRIGGER_SCHEMA='dbname'；<br/>`<br/><br/>有关此表的更多信息，请参阅[第 26.3.45 节，“信息\_SCHEMA 触发器表”](information-schema-triggers-table.html).<br/><br/>您还可以使用[`显示触发器`](show-triggers.html)语句，这是特定于 MySQL 的。看[第 13.7.7.40 节，“显示触发器语句”](show-triggers.html). |
| [](<>)[](<>)<br/><br/>**A.5.7.** | 触发器存储在哪里？ |
|  | 触发器存储在`mysql.triggers`系统表，它是数据字典的一部分。 |
| [](<>)[](<>)<br/><br/>**A.5.8。** | 触发器可以调用存储过程吗？ |
|  | 是的。 |
| [](<>)[](<>)<br/><br/>**A.5.9。** | 触发器可以访问表吗？ |
|  | 触发器可以访问自己表中的旧数据和新数据。触发器也可以影响其他表，但不允许修改已被调用函数或触发器的语句使用（用于读取或写入）的表。 |
| [](<>)[](<>)<br/><br/>**A.5.10。** | 一个表可以有多个触发器具有相同的触发事件和动作时间吗？ |
|  | 在 MySQL 8.0 中，可以为给定的表定义多个触发器，这些触发器具有相同的触发器事件和操作时间。例如，您可以有两个`更新前`表的触发器。默认情况下，具有相同触发事件和操作时间的触发器按创建顺序激活。要影响触发顺序，请在后面指定一个子句`每一行`这表明`关注`要么`之前`以及现有触发器的名称，该触发器也具有相同的触发器事件和操作时间。和`关注`，新触发器在现有触发器之后激活。和`之前`，新触发器在现有触发器之前激活。 |
| [](<>)[](<>)<br/><br/>**A.5.11。** | 触发器是否可以更新远程服务器上的表？ |
|  | 是的。远程服务器上的表可以使用`联邦的`存储引擎。（见[第16.8节，“联邦存储引擎”](federated-storage-engine.html)). |
| [](<>)[](<>)<br/><br/>**A.5.12。** | 触发器与复制一起工作吗？ |
|  | 对然而，它们的工作方式取决于您使用的是MySQL的“经典”基于语句的复制格式还是基于行的复制格式。<br/><br/>使用基于语句的复制时，副本上的触发器由在源上执行（并复制到副本）的语句执行。<br/><br/>使用基于行的复制时，由于在源上运行然后复制到复制副本的语句，触发器不会在复制副本上执行。相反，当使用基于行的复制时，在源上执行触发器引起的更改将应用于副本。<br/><br/>有关更多信息，请参阅[第17.5.1.36节，“复制和触发器”](replication-features-triggers.html). |
| [](<>)[](<>)<br/><br/>**A.5.13。** | 如何通过复制到副本的源上的触发器执行操作？ |
|  | 同样，这取决于您使用的是基于语句的复制还是基于行的复制。<br/><br/>**基于语句的复制。**首先，必须在副本服务器上重新创建源上存在的触发器。完成后，复制流将与参与复制的任何其他标准DML语句一样工作。例如，考虑一张表格`电磁脉冲`这有一个`之后`插入触发器，该触发器存在于复制源服务器上。相同的`电磁脉冲`桌子和`之后`复制服务器上也存在插入触发器。复制流程将是：<br/><br/>1.安[`插入`](insert.html)声明是为了`电磁脉冲`.<br/><br/>2.最新进展`之后`触发`电磁脉冲`激活。<br/><br/>3.问题[`插入`](insert.html)语句被写入二进制日志。<br/><br/>4.复制品拾取[`插入`](insert.html)对…的声明`电磁脉冲`然后执行它。<br/><br/>5.最新进展`之后`触发`电磁脉冲`存在于复制副本上的。<br/><br/>**基于行的复制。**使用基于行的复制时，在源上执行触发器引起的更改将应用于复制副本。但是，在基于行的复制下，触发器本身实际上不会在复制副本上执行。这是因为，如果源和副本都应用了来自源的更改，并且导致这些更改的触发器也应用于副本，那么这些更改实际上会在副本上应用两次，从而导致源和副本上的数据不同。<br/><br/>在大多数情况下，基于行和基于语句的复制的结果都是相同的。但是，如果在源和副本上使用不同的触发器，则不能使用基于行的复制。（这是因为基于行的格式将源上执行的触发器所做的更改复制到副本，而不是导致触发器执行的语句，并且副本上的相应触发器不会执行。）相反，任何导致执行此类触发器的语句都必须使用基于语句的复制进行复制。<br/><br/>有关更多信息，请参阅[第17.5.1.36节，“复制和触发器”](replication-features-triggers.html). |
