Spec-Zone.ru › MySQL 5.7

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

A.5.1. Где можно найти документацию по триггерам MySQL 5.7?
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 5.7?

См. Раздел 23.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. См. Раздел 13.1.20, «Оператор CREATE TRIGGER» и Раздел 13.1.31, «Оператор DROP TRIGGER» для получения более подробной информации об этих операторах.

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

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

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

A.5.7.

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

Триггеры хранятся в .TRG файлах, по одному такому файлу на таблицу.

A.5.8.

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

Да.

A.5.9.

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

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

A.5.10.

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

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

A.5.11.

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

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

A.5.12.

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

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

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

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

Для получения дополнительной информации см. Раздел 16.4.1.34, «Репликация и триггеры».

A.5.13.

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

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

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

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

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

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

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

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

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

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

Для получения дополнительной информации см. Раздел 16.4.1.34, «Репликация и триггеры».

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

Spec-Zone.ru

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