4.1.36复制和触发器

使用基于语句的复制,在源上执行的触发器也会在副本上执行。使用基于行的复制,在源上执行的触发器不会在副本上执行。相反,在源上由触发器执行产生的行更改被复制并应用到副本上。

这种行为是设计好的。如果在基于行的复制中,副本应用了触发器以及由触发器引起的行更改,那么这些更改实际上会在副本上应用两次,导致源和副本上的数据不同。

如果希望在源和副本上同时执行触发器,可能是因为源和副本上有不同的触发器,那么必须使用基于语句的复制。但是,要启用复制端触发器,并不需要专门使用基于语句的复制。只对需要这种效果的语句切换到基于语句的复制就足够了,其余时间则使用基于行的复制。

一种调用触发器(或函数)的语句,该语句将导致更新AUTO_INCREMENT使用基于语句的复制无法正确复制列。MySQL 8.0将这样的语句标记为不安全。(错误# 45677)

一个触发器可以有不同组合的触发器(插入更新删除)和行动时间(之前),并且允许多个触发器。

为简便起见,多个触发器这里有个简写具有相同触发事件和动作时间的多个触发器。

升级。在MySQL 5.7之前的版本中不支持多个触发器。如果在使用MySQL 5.7之前版本的复制拓扑中升级服务器,请先升级副本,然后升级源。如果升级后的复制源服务器仍然拥有使用不支持多个触发器的MySQL版本的旧副本,那么如果在源上为一个已经具有相同触发器事件和操作时间的触发器的表创建了一个触发器,则在这些副本上将发生错误。

降级。如果您将支持多个触发器的服务器降级到不支持多个触发器的旧版本,降级会产生以下影响:

  • 对于每个具有触发器的表,所有触发器定义都在.TRG文件表。但是,如果有多个触发器具有相同的触发器事件和操作时间,则当触发器事件发生时,服务器只执行其中一个触发器。和有关信息。.TRG请参阅MySQL Server Doxygen文档中的表触发器存储部分10bet官方网站https://dev.10bet靠谱mysql.com/doc/index-other.html

  • 如果该表的触发器在降级之后被添加或删除,服务器将重写该表的触发器.TRG文件。重写后的文件只保留每个触发器事件和动作时间的组合中的一个触发器;其他人都不见了。

为了避免这些问题,请在降级前修改触发器。对于每个有多个触发器的表,每个触发器事件和动作时间的组合,将每个这样的触发器集转换为单个触发器,如下所示:

  1. 对于每个触发器,创建一个存储例程,其中包含触发器中的所有代码。值访问使用而且可以使用参数传递给例程。如果触发器需要代码中的单个结果值,则可以将代码放入存储的函数中,并让函数返回该值。如果触发器需要来自代码的多个结果值,则可以将代码放入存储过程中并使用返回值参数。

  2. 删除表的所有触发器。

  3. 为调用刚刚创建的存储例程的表创建一个新的触发器。因此,该触发器的效果与它所替代的多个触发器相同。