# TRIGGERS
The CREATE TRIGGER statement creates a trigger named ins_sum that is associated with the account table. It also includes clauses that specify the trigger action time, the triggering event, and what to do when the trigger activates
Insert Value
To use the trigger, set the accumulator variable (@sum) to zero, execute an INSERT statement, and then see what value the variable has afterward:
In this case, the value of @sum after the INSERT statement has executed is 14.98 + 1937.50 — 100, or 1852.48.
What are the Triggers in SQL?
![]()
A Trigger is a stored procedure in a database that automatically invokes whenever a special event in the database occurs.
For Example → A trigger can be invoked when a row is inserted into a specified table or when certain table columns are being updated.
Data Manipulation Language (DML)
→ DELETE
→ INSERT
→ UPDATE
Data Definition Langauge (DDL)
→ CREATE
→ ALTER
→ DROP
Database Operation
→ SERVERERROR
→ LOGON
→ LOGOFF
→ STARTUP
→ SHUTDOWN
Syntax of Trigger :
- CREATE [OR REPLACE] TRIGGER trigger_name − Creates or replaces an existing trigger with the trigger_name.
- − This specifies when the trigger will be executed. The INSTEAD OF clause is used for creating a trigger on a view.
- − This specifies the DML operation.
- [OF col_name] − This specifies the column name that will be updated.
- [ON table_name] − This specifies the name of the table associated with the trigger.
- [REFERENCING OLD AS o NEW AS n] − This allows you to refer new and old values for various DML statements, such as INSERT, UPDATE, and DELETE.
- [FOR EACH ROW] − This specifies a row-level trigger, i.e., the trigger will be executed for each row being affected. Otherwise, the trigger will execute just once when the SQL statement is executed, which is called a table-level trigger.
- WHEN (condition) − This provides a condition for rows for which the trigger would fire. This clause is valid only for row-level triggers.
Types of Triggers :
→DDL Triggers :
In SQL Server we can create triggers on DDL statements (like CREATE, ALTER, and DROP) and the certain system-defined stored procedures that perform DDL like operations.
We can use only AFTER/BEFORE in DDL triggers not INSTEAD OF clause means we can make only ADTER/BEFORE triggers on DDL statements
DDL triggers can be used to observe and control actions performed on the server and to audit these operations. DDL triggers can be used to manage administrative tasks such as auditing and regulating database operations.
→ DML Triggers :
In SQL Server we can create triggers on DML statements (like INSERT, UPDATE and DELETE) and stored procedures that perform DML like operations.
DML Triggers are of two types :
- AFTER/BEFORE Trigger (using AFTER/BEFORE clause)
This type of trigger fires after or before SQL Server finishes the execution of action successfully that fired it. - INSTEAD OF Trigger (using INSTEAD OF clause)
This type of trigger fires before SQL Server starts the execution of the action that fixed it. INSTEAD OF trigger replaces the original operation. This differs from the AFTER/BEFORE trigger, which fires after or before the actions that caused it to fire. We can have an INSTEAD OF insert/update/delete trigger on a table that successfully executed but does not include the actual insert/update/delete to the table.
→ LOGON Triggers :
LOGON triggers are a special type of trigger that fires when the LOGON event of SQL Server is raised. This event is raised when a user session is being established with SQL Server that is made after the authentication phase finishes, but before the user session is actually established. Hence all messages that we define in the trigger such as error messages, will be redirected to the SQL Server error log. LOGON triggers do not fire if authentication fails. We can use these triggers to audit and control server sessions, such as to track login activity or limit the number of sessions for a specific login.
Использование триггеров базы данных MySQL в Ubuntu 18.04

Триггер в MySQL — это определяемая пользователем SQL-команда, которая автоматически вызывается во время операций INSERT , DELETE или UPDATE . Код триггера связан с таблицей и уничтожается после удаления таблицы. Вы можете определить время действия триггера и указать, когда его нужно активировать – до или после определенного события базы данных.
Триггеры имеют несколько преимуществ Например, вы можете использовать их для генерации значения производного столбца во время выполнения INSERT . Еще один вариант использования триггера – обеспечение ссылочной целостности при сохранении записи в нескольких связанных таблицах. Также к преимуществам триггеров относятся регистрация действий пользователя для аудита таблиц и оперативное копирование данных в разных схемах баз данных для обеспечения избыточности и предотвращения единой точки отказа.
Вы также можете использовать триггеры, чтобы сохранить правила проверки на уровне базы данных. Это помогает избежать нарушения бизнес-логики при совместном использовании одного источника данных несколькими приложениями. Это значительно уменьшает количество обращений к серверу базы данных, что, в свою очередь, улучшает время отклика приложений. Поскольку сервер базы данных выполняет триггеры, они могут воспользоваться улучшенными ресурсами сервера, такими как RAM и CPU.
В этом обучающем модуле вы научитесь создавать, использовать и удалять различные типы триггеров в вашей базе данных MySQL.
Предварительные требования
Прежде чем начать, убедитесь в наличии следующего:
- Один сервер Ubuntu 18.04, настроенный в соответствии с инструкциями по начальной настройке сервера с Ubuntu 18.04, а также пользователь sudo без прав root.
- База данных MySQL, работающая на вашем сервере в соответствии с инструкцией по установке MySQL на Ubuntu 18.04
- Учетные данные root пользователя для вашей базы данных MySQL.
Шаг 1 — Создание тестовой базы данных
На этом этапе вы создадите тестовую клиентскую базу данных пользователя с несколькими таблицами для демонстрации работы триггеров MySQL.
Более подробно о работе MySQL можно прочитать в инструкции Запросы в MySQL.
Вначале войдите на сервер MySQL как root:
По запросу введите свой root пароль MySQL и нажмите ENTER для продолжения. Когда вы увидите mysql> , выполните следующую команду, чтобы создать базу данных test_db :
Далее переходите к test_db с помощью:
Начинайте с создания таблицы customers . В этой таблице будут храниться записи клиентов, включая customer_id , customer_name и level . Будет два типа клиентов: BASIC и VIP .
Теперь, добавьте несколько записей в таблицу customers . Для этого выполните следующие команды одну за другой:
После выполнения каждой команды INSERT вы увидите следующий вывод:
Чтобы убедиться, что тестовые записи были успешно вставлены, выполните команду SELECT :
Затем создайте другую таблицу customers для хранения соответствующей информации об учетной записи клиентов. Таблица будет содержать поля customer_id и status_notes .
Запустите следующую команду:
Далее создайте таблицу sales . В этой таблице будут храниться данные о продажах, имеющих отношение к разным клиентам в столбце customer_id :
Вы сможете добавить тестовые данные в колонку sales на следующих этапах во время тестирования триггеров. Далее создайте таблицу audit_log для регистрации обновлений, внесенных в таблицу sales при имплементации триггера AFTER UPDATE в шаге 5:
Имея базу данных test_db и четыре таблицы, теперь вы можете перейти к работе с различными триггерами MySQL в вашей базе данных.
Шаг 2 — Создание триггера Before Insert
На этом этапе вы изучите синтаксис триггера MySQL перед тем, как применить эту логику для создания триггера BEFORE INSERT , который проверяет поле sales_amount перед вставкой данных в таблицу sales .
Общий синтаксис для создания триггера MySQL показан в следующем примере:
Структура триггера включает:
DELIMITER // : разделитель MySQL по умолчанию — это ; . Его нужно заменить на что-то другое, для того, чтобы MySQL рассматривал следующие строки, как одну команду, пока не достигнет пользовательского разделителя. В данном примере в качестве разделителя используется // , а стандартный разделитель ; стоит в конце.
[TRIGGER_NAME] : триггер должен иметь имя, и вы можете указать его именно здесь.
[TRIGGER TIME] : триггер может быть вызван в разные моменты времени. MySQL позволяет определить, когда запускать триггер — до или после операции с базой данных.
[TRIGGER EVENT] : триггеры могут быть вызваны только операциями INSERT , UPDATE и DELETE . Вы можете использовать любое из значений в зависимости от того, чего вы хотите достичь.
[TABLE] : любой триггер, который вы создаете в своей базе данных MySQL, должен быть связан с таблицей.
FOR EACH ROW : этот оператор позволяет MySQL выполнять код триггера для каждой строки, на которую влияет триггер.
[TRIGGER BODY] : код, который выполняется при вызове триггера, называется trigger body. Это может быть один SQL-оператор или несколько команд. Обратите внимание, если вы выполняете несколько SQL-операторов в теле триггера, вы должны заключить их в блок BEGIN. END .
Примечание: при создании тела триггера вы можете использовать ключевые слова OLD и NEW для доступа к старым и новым значениям колонки, введенным во время операции INSERT , UPDATE и DELETE . В триггере DELETE может быть использовано только ключевое слово OLD (подробнее об этом в шаге 4).
Теперь вы можете создать свой первый триггер BEFORE INSERT . Триггер будет связан с таблицей sales и будет вызываться перед вставкой записи для проверки sales_amount . Функция триггера состоит в том, чтобы проверить, превышает ли значение sales_amount , вставляемое в таблицу продаж, величину 10000 , и выдать ошибку, если это так.
Убедитесь, что вы вошли на сервер MySQL. Затем введите следующие команды MySQL одну за другой:
Используйте IF. THEN. END IF для оценки того, находится ли сумма, указанная в операторе INSERT , в пределах вашего диапазона. Триггер может извлечь новое значение sales_amount , используя ключевое слово NEW .
Чтобы вызвать общее сообщение об ошибке, используются следующие строки для информирования пользователя:
Далее вставьте запись sales_amount со значением 11000 в таблицу sales , чтобы проверить, остановит ли триггер операцию:
Эта ошибка показывает, что код триггера работает должным образом.
Теперь попробуйте новую запись со значением 7500 , чтобы проверить правильность действия команды:
Поскольку значение находится в рекомендованном диапазоне, вы увидите следующий вывод:
Для подтверждения вставки данных запустите следующую команду:
Вывод подтверждает вставку данных в таблицу:
На этом этапе вы протестировали способность триггеров проверять данные перед вставкой в базу данных.
Теперь поработайте с триггером AFTER INSERT для сохранения связанной информации в разных таблицах.
Шаг 3 — Создание триггера After Insert
Триггеры AFTER INSERT выполняются после успешной вставки записей в таблицу. Эта функция может использоваться для автоматического запуска других бизнес-логик. Например, в банковских приложениях триггер AFTER INSERT может закрывать кредитный счет, когда клиент завершает выплату кредита. Триггер может отслеживать все платежи, внесенные в таблицу транзакций, и автоматически закрывать кредит, как только кредитный баланс будет равен нулю.
На этом этапе вы поработаете с таблицей customer_status , используя триггер AFTER INSERT для ввода связанных клиентских записей.
Для создания триггера AFTER INSERT введите следующие команды:
Таким образом вы инструктируете MySQL сохранить еще одну запись в таблицу customer_status , как только происходит вставка новой клиентской записи в таблицу customers .
Теперь вставьте новую запись в таблицу customers , чтобы убедиться, что код триггера вызывается:
После успешной вставки записи убедитесь, что запись нового статуса была добавлена в таблицу customer_status :
Вывод подтверждает успешную работу триггера.
Триггер AFTER INSERT полезен для мониторинга жизненного цикла клиента. В производственной среде учетные записи клиентов могут проходить различные этапы, например открытие, приостановка и закрытие счета.
На следующем этапе вы будете работать с триггерами UPDATE .
Шаг 4 — Создание триггера Before Update
Триггер BEFORE UPDATE схож с триггером BEFORE INSERT , разница заключается в том, когда они вызываются. Вы можете использовать триггер BEFORE UPDATE для проверки бизнес-логики перед обновлением записи. Для проверки используйте таблицу customers , в которую вы уже вставили некоторые данные.
В базе данных есть два типа клиентов. В этом примере после того, как учетная запись клиента будет обновлена до уровня VIP , она не сможет быть понижена до уровня BASIC . Чтобы применить такое правило, создайте триггер BEFORE UPDATE , который будет выполняться перед оператором UPDATE , как показано ниже. Если пользователь базы данных попытается понизить клиента до уровня BASIC с уровня VIP , будет активировано определяемое пользователем исключение.
Введите следующие команды SQL одну за другой, чтобы создать триггер BEFORE UPDATE :
Используйте ключевое слово OLD для фиксации уровня, предоставленного пользователем при выполнении команды UPDATE . Опять же, вы используете IF. THEN. END IF , чтобы сообщить пользователю об общей ошибке.
Далее выполните следующую SQL команду, которая попытается понизить учетную запись клиента, имеющую идентификатор customer_id , равный 3 :
Вы увидите следующий вывод, предоставляющий SET MESSAGE_TEXT :
Если вы выполните ту же команду для клиента уровня BASIC и попытаетесь повысить учетную запись до уровня VIP , команда выполнится успешно:
Вы использовали триггер BEFORE UPDATE для применения бизнес-правила. Теперь перейдем к использованию триггера AFTER UPDATE для ведения журнала аудита.
Шаг 5 — Создание триггера After Update
Триггер AFTER UPDATE вызывается после успешного обновления записи в базе данных. Такое поведение триггера подходит для ведения журнала аудита. В многопользовательской среде администратор с целью аудита может просмотреть историю пользователей, обновляющих записи в конкретной таблице.
Вы создаете триггер, который регистрирует активность обновления таблицы sales . Наша таблица audit_log будет содержать информацию о пользователях MySQL, обновляющих таблицу sales , дату обновления date , а также новые new и старые old значения sales_amount .
Для создания триггера, выполните следующие команды SQL:
Вы вставляете новую запись в таблицу audit_log . Вы используете ключевое слово NEW для получения значения sales_id и нового значения sales_amount . Также вы используете ключевое слово OLD для получения предыдущего значения sales_amount , если вы хотите зарегистрировать обе суммы для аудита.
Команда SELECT USER() извлекает текущего пользователя, выполняющего операцию, а оператор NOW() извлекает значение текущей даты и времени с сервера MySQL.
Теперь, если пользователь попытается обновить значение какой-либо записи в таблице sales , триггер log_sales_updates вставит новую запись в таблицу audit_log .
Давайте создадим новую запись о продажах со случайным значением sales_id , равным 5 , и попробуем обновить ее. Сначала вставьте запись о продажах:
Затем обновите запись:
Вывод должен выглядеть так:
Теперь выполните следующую команду, чтобы проверить, смог ли триггер AFTER UPDATE зарегистрировать новую запись в таблице audit_log :
Триггер зарегистрировал обновление. Ваш вывод должен показать предыдущую сумму sales_amount и новую сумму new amount , зарегистрированную пользователем, который обновил запись:
Также в таблице вы увидите дату и время, когда было выполнено обновление, что важно для аудита.
Далее вы будете использовать триггер DELETE для обеспечения целостности ссылок на уровне базы данных.
Шаг 2 — Создание триггера Before Delete
Триггеры BEFORE DELETE вызываются до выполнения операции DELETE в таблице. Этот вид триггеров обычно используется для обеспечения целостности ссылок в разных связанных таблицах. Например, каждая запись в таблице sales связана с записью customer_id из таблицы customers . Если пользователь базы данных удалил из таблицы customers запись, у которой есть связанная запись в таблице sales , у вас не будет возможности узнать, какой клиент был связан с этой записью.
Избежать подобных ситуаций и сделать логику более надежной позволит создание триггера BEFORE DELETE . Выполните следующие SQL команды одну за другой:
Теперь попробуйте удалить клиента, у которого есть связанная запись в таблице sales:
В результате вы получите следующий вывод:
Триггер BEFORE DELETE может предотвратить случайное удаление связанной информации в базе данных.
В некоторых ситуациях может потребоваться удалить из разных связанных таблиц все записи, связанные с конкретной записью. В этой ситуации возможно использовать триггер AFTER DELETE , который вы протестируете в следующем шаге.
Шаг 5 — Создание триггера After Delete
Триггеры AFTER DELETE активируются, когда запись была успешно удалена. Примером использования триггера AFTER DELETE является ситуация, когда скидка, которую получает конкретный клиент, определяется количеством покупок, совершенных этим клиентом в течение определенного периода. Если некоторые из записей клиента будут удалены из таблицы sales , скидка для этого клиента должна уменьшиться.
Еще один вариант использования триггера AFTER DELETE — удаление связанной информации из других таблиц после удаления записи из базовой таблицы. Например, вы можете установить триггер, который удаляет запись о клиенте, если записи о продажах с соответствующим customer_id будут удалены из таблицы sales . Запустите следующую команду для создания триггера:
Далее запустите следующую команду, чтобы удалить все записи о продажах, связанных с customer_id , равному 2 :
Теперь проверьте, удалились ли записи для этого клиента из таблицы sales :
Вы получите вывод Empty Set , поскольку запись клиента, связанная с customer_id 2 , была удалена триггером:
Вы научились использовать все виды триггеров для выполнения разных функций. Далее вы узнаете, как удалить триггер из базы данных, если он вам больше не нужен.
Шаг 8 — Удаление триггеров
Как и любой другой объект базы данных, вы можете удалить триггеры с помощью команды DROP . Синтакс удаления триггера следующий:
Например, чтобы удалить последний созданный триггер AFTER DELETE , выполните следующую команду:
Необходимость удаления триггеров возникает, когда вы хотите воссоздать его структуру. В таком случае вы можете сбросить триггер и создать новый с помощью разных команд для триггеров.
Заключение
В этом обучающем руководстве вы научились создавать, использовать и удалять различные триггеры из базы данных MySQL. На примере клиентской базы данных вы ознакомились с применением триггеров для различных целей, таких как проверка данных, применение бизнес-логики, ведение журнала аудита и обеспечение целостности ссылок.
Дополнительную информацию по использованию вашей базы данных MySQL можно найти здесь:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
How does "for each row" work in triggers in mysql?
In mysql triggers, when I do a «after update» on table A and then use «for each row», will it run the body of the trigger for each row in A every time a row gets updated in A , or is it saying to apply the trigger to every row in A and then if a row gets updated, it will only run the body code for that updated row only?
4 Answers 4
FOR EACH ROW means for each of the matched row that gets either updated or deleted.
Trigger body won’t loop through the entire table data unless there is a where condition in the query.