Spec-Zone.ru › MySQL 9.2

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

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

См. Раздел 27.4, “Использование триггеров”.

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

Информацию о триггерах можно получить, запросив таблицу INFORMATION_SCHEMA.TRIGGERS. См. Раздел 28.3.46, “Таблица 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.46, “Таблица 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 9.2 возможно определение нескольких триггеров для одной таблицы, имеющих одинаковое событие триггера и время действия. Например, вы можете иметь два BEFORE UPDATE триггера для таблицы. По умолчанию триггеры, имеющие одинаковое событие триггера и время действия, активируются в порядке их создания. Чтобы повлиять на порядок триггеров, укажите предложение после FOR EACH ROW, которое указывает FOLLOWS или PRECEDES и имя существующего триггера, который также имеет то же событие триггера и время действия. С FOLLOWS новый триггер активируется после существующего триггера. С PRECEDES новый триггер активируется до существующего триггера.

A.5.11.

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

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

A.5.12.

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

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

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

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

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

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.37, “Репликация и триггеры”.

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

Spec-Zone.ru

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