Spec-Zone.ru › MySQL 8.4

A.5 MySQL 8.4 FAQ: Триггеры

A.5.1. Где можно найти документацию по триггерам MySQL 8.4?
A.5.2. Есть ли форум обсуждения триггеров MySQL?
A.5.3. MySQL имеет триггеры уровня операторов или строк?
A.5.4. Есть ли какие-либо триггеры по умолчанию?
A.5.5. Как управляются триггеры в MySQL?
A.5.6. Можно ли просмотреть все триггеры в заданной базе данных?
A.5.7. Где хранятся триггеры?
A.5.8. Может ли триггер вызвать хранимую процедуру?
A.5.9. Могут ли триггеры обращаться к таблицам?
A.5.10. Может ли таблица иметь несколько триггеров с одним и тем же событием триггера и временем действия?
A.5.11. Возможно ли обновление триггером таблиц на удаленном сервере?
A.5.12. Работают ли триггеры с репликацией?
A.5.13. Как действия, выполняемые через триггеры на источнике, реплицируются на реплику?

A.5.1.

Где можно найти документацию по триггерам MySQL 8.4?

См. Раздел 27.3, «Использование триггеров».

A.5.2.

Есть ли форум по обсуждению триггеров MySQL?

Да. Он доступен по адресу https://forums.mysql.com/list.php?99.

A.5.3.

Поддерживает ли MySQL триггеры уровня операторов или уровня строк?

Все триггеры являются FOR EACH ROW; то есть триггер активируется для каждой строки, которая вставляется, обновляется или удаляется. MySQL не поддерживает триггеры, использующие FOR EACH STATEMENT.

A.5.4.

Есть ли какие-либо триггеры по умолчанию?

Нет, явно. MySQL имеет специфическое специальное поведение для некоторых TIMESTAMP столбцов, а также для столбцов, определённых с использованием AUTO_INCREMENT.

A.5.5.

Как управлять триггерами в MySQL?

Триггеры можно создать с помощью оператора CREATE TRIGGER и удалить с помощью DROP TRIGGER. Подробнее об этих операторах см. в Разделе 15.1.22, «Оператор CREATE TRIGGER» и Разделе 15.1.34, «Оператор DROP TRIGGER».

Информацию о триггерах можно получить, запросив таблицу INFORMATION_SCHEMA.TRIGGERS. Подробнее см. в Разделе 28.3.44, «Таблица 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';

Дополнительную информацию об этой таблице см. в Разделе 28.3.44, «Таблица INFORMATION_SCHEMA TRIGGERS».

Также можно использовать оператор SHOW TRIGGERS, специфичный для MySQL. См. Раздел 15.7.7.40, «Оператор SHOW TRIGGERS».

A.5.7.

Где хранятся триггеры?

Триггеры хранятся в таблице системы mysql.triggers, которая является частью словаря данных.

A.5.8.

Может ли триггер вызвать хранимую процедуру?

Да.

A.5.9.

Могут ли триггеры получать доступ к таблицам?

Триггер может получать доступ как к старым, так и к новым данным в своей собственной таблице. Триггер также может влиять на другие таблицы, но не разрешено изменять таблицу, которая уже используется (для чтения или записи) оператором, вызвавшим функцию или триггер.

A.5.10.

Может ли таблица иметь несколько триггеров с одинаковым событием триггера и временем действия?

В MySQL 8.4 возможно определение нескольких триггеров для данной таблицы с одинаковым событием триггера и временем действия. Например, можно иметь два BEFORE UPDATE триггера для таблицы. По умолчанию триггеры с одинаковым событием и временем действия активируются в порядке их создания. Для изменения порядка триггеров укажите в клаузе после FOR EACH ROW, что это FOLLOWS или PRECEDES и имя существующего триггера, имеющего такое же событие и время действия. С помощью FOLLOWS новый триггер активируется после существующего. С помощью PRECEDES новый триггер активируется до существующего.

A.5.11.

Возможно ли обновление таблиц на удалённом сервере с помощью триггера?

Да. Таблица на удалённом сервере может быть обновлена с помощью движка хранения FEDERATED. (См. Раздел 18.8, «Движок хранения FEDERATED»).

A.5.12.

Работают ли триггеры с репликацией?

Да. Однако, способ их работы зависит от того, используете ли вы «классический» основанный на операторах или основанный на строках формат репликации MySQL.

При использовании репликации на основе операторов, триггеры на реплике выполняются операторами, выполняемыми на источнике (и реплицируемыми на реплику).

При использовании репликации на основе строк, триггеры не выполняются на реплике из-за операторов, которые были выполнены на источнике и затем реплицированы на реплику. Вместо этого, при использовании репликации на основе строк, изменения, вызванные выполнением триггера на источнике, применяются на реплике.

Более подробная информация доступна в Разделе 19.5.1.36, «Репликация и триггеры».

A.5.13.

Как действия, выполняемые через триггеры на источнике, распространяются на реплику?

Опять же, это зависит от того, используете ли вы репликацию на основе операторов или на основе строк.

Репликация на основе операторов. Сначала триггеры, которые существуют на источнике, должны быть воссозданы на сервере реплики. После этого поток репликации работает как любой другой стандартный оператор DML, участвующий в репликации. Например, рассмотрим таблицу EMP, у которой есть AFTER триггер вставки, который существует на сервере репликации источника. Та же самая EMP таблица и AFTER триггер вставки существуют и на сервере реплики. Поток репликации будет таким:

  1. Оператор INSERT выполняется для EMP.

  2. AFTER триггер вставки на EMP активируется.

  3. Оператор INSERT записывается в двоичный журнал.

  4. Реплика выбирает оператор INSERT для EMP и выполняет его.

  5. AFTER триггер вставки на EMP, который существует на реплике, активируется.

Репликация на основе строк. При использовании репликации на основе строк, изменения, вызванные выполнением триггера на источнике, применяются на реплике. Однако сами триггеры фактически не выполняются на реплике в ходе репликации на основе строк. Это происходит потому, что если и источник, и реплика применяют изменения от источника, и, кроме того, триггер, вызывающий эти изменения, применяется на реплике, изменения фактически будут применены дважды на реплике, что приведёт к разным данным на источнике и реплике.

В большинстве случаев результат одинаковый для репликации на основе строк и операторов. Однако если вы используете разные триггеры на источнике и реплике, вы не можете использовать репликацию на основе строк. (Это потому, что формат на основе строк реплицирует изменения, сделанные триггерами, выполняющимися на источнике, на реплики, а не операторы, которые вызвали выполнение триггеров, и соответствующие триггеры на реплике не выполняются.) Вместо этого любые операторы, вызывающие такие триггеры, должны быть реплицированы с помощью репликации на основе операторов.

Более подробная информация доступна в Разделе 19.5.1.36, «Репликация и триггеры».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/faqs-triggers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API