19.5.1.37 Репликация и триггеры
При репликации на основе операторов триггеры, выполняемые на источнике, также выполняются на реплике. При репликации на основе строк триггеры, выполняемые на источнике, не выполняются на реплике. Вместо этого изменения строк на источнике, вызванные выполнением триггера, реплицируются и применяются на реплике.
Это поведение по умолчанию. Если бы при репликации на основе строк реплика также применяла триггеры, а также изменения строк, вызванные ими, то изменения фактически применялись бы дважды на реплике, что приведет к разным данным на источнике и реплике.
Если вы хотите, чтобы триггеры выполнялись как на источнике, так и на реплике, возможно, потому что у вас разные триггеры на источнике и реплике, вы должны использовать репликацию на основе операторов. Однако для включения триггеров на стороне реплики не обязательно использовать исключительно репликацию на основе операторов. Достаточно переключиться на репликацию на основе операторов только для тех операторов, где вы хотите этот эффект, и использовать репликацию на основе строк в остальное время.
Оператор, вызывающий триггер (или функцию), который приводит к обновлению AUTO_INCREMENT столбца, не реплицируется корректно при использовании репликации на основе операторов. MySQL 9.2 отмечает такие операторы как небезопасные. (Ошибка #45677)
Триггер может иметь триггеры для разных комбинаций события триггера (INSERT, UPDATE, DELETE) и времени действия (BEFORE, AFTER), и разрешено несколько триггеров.
Для краткости, “несколько триггеров” здесь является сокращением для “несколько триггеров, имеющих одинаковое событие триггера и время действия.”
Обновления. Несколько триггеров не поддерживаются в версиях, более ранних чем MySQL 5.7. Если вы обновляете серверы в топологии репликации, использующей версию, более раннюю чем MySQL 5.7, сначала обновите реплики, а затем обновите источник. Если обновленный сервер источника репликации по-прежнему имеет старые реплики, использующие версии MySQL, которые не поддерживают несколько триггеров, на этих репликах возникает ошибка, если триггер создается на источнике для таблицы, которая уже имеет триггер с тем же событием триггера и временем действия.
Понижение. Если вы понижаете сервер, поддерживающий несколько триггеров, до более старой версии, которая этого не делает, понижение оказывает следующие эффекты:
Для каждой таблицы, имеющей триггеры, все определения триггеров находятся в файле
.TRGдля таблицы. Однако, если есть несколько триггеров с одинаковым событием триггера и временем действия, сервер выполняет только один из них при возникновении события триггера. Справочную информацию по файлам.TRGсм. в разделе «Хранение триггеров таблиц» документации MySQL Server Doxygen, доступной по адресу https://dev.mysql.com/doc/index-other.html.Если триггеры для таблицы добавляются или удаляются после понижения, сервер перезаписывает файл
.TRGтаблицы. В переписанном файле остается только один триггер на каждую комбинацию события триггера и времени действия; остальные теряются.
Чтобы избежать этих проблем, измените триггеры перед понижением. Для каждой таблицы, имеющей несколько триггеров на комбинацию события триггера и времени действия, преобразуйте каждый такой набор триггеров в один триггер следующим образом:
Для каждого триггера создайте хранимую процедуру, содержащую весь код триггера. Значения, к которым осуществляется доступ с помощью
NEWиOLD, могут быть переданы в процедуру с помощью параметров. Если триггеру нужно одно результирующее значение из кода, вы можете поместить код в хранимую функцию и сделать так, чтобы функция возвращала значение. Если триггеру нужно несколько результирующих значений из кода, вы можете поместить код в хранимую процедуру и возвращать значения с помощью параметровOUT.Удалите все триггеры для таблицы.
Создайте один новый триггер для таблицы, который вызывает только что созданные хранимые процедуры. Таким образом, эффект этого триггера будет таким же, как и у множества триггеров, которые он заменяет.
© 2025 Oracle
Licensed under the GPLv2 License.