Содержание

Хранимые процедуры, функции и триггеры

PostgreSQL

Есть ли в PostgreSQL хранимые процедуры? В чистом виде нет.

MySQL

Триггеры Движок БД MySQL. Поддержка для триггеров включена, начиная с MySQL 5.0.2.

Триггер представляет собой именованный объект базы данных (хранимая процедура), который связан с таблицей, и он будет активизирован, когда специфическое событие INSERT, UPDATE и DELETE (вставка, обновление строки или удаление) происходит для таблицы. Триггеры могут срабатывать как до BEFORE так и после AFTER изменения таблицы.

CREATE TRIGGER trigger_name trigger_time trigger_event
  ON tbl_name FOR EACH ROW trigger_stmt

где

trigger_name — название триггера
trigger_time — Время срабатывания триггера. BEFORE — перед событием. AFTER — после события.
trigger_event — Событие:
insert — событие возбуждается операторами insert, data load, replace
update — событие возбуждается оператором update
delete — событие возбуждается операторами delete, replace.
Операторы DROP TABLE и TRUNCATE не активируют выполнение триггера
tbl_name — название таблицы
trigger_stmt выражение, которое выполняется при активации триггера

Пример MySQL триггера

Задача. Нужно после вставки (INSERT) строки в таблицу cdr, обновить (UPDATE) таблицу actions внеся в нее значение id новой записи таблицы cdr.

mysql> DELIMITER //
mysql> CREATE TRIGGER `ti_cdr` AFTER INSERT ON `mbillcc`.`cdr`
    -> FOR EACH ROW
    -> BEGIN
    -> UPDATE actions SET state = NEW.id WHERE action = 'cdrrow_end';
    -> END//
Query OK, 0 ROWS affected (0.00 sec)
 
mysql> DELIMITER ;

NEW — для доступа к новым записям; OLD — для доступа к старым записям.

Пример хранимой процедуры MySQL

В данном примере процедура не принимает параметров и просто выполняет стандартный SELECT-запрос. Вы можете создавать процедуры с входными параметрами, обработкой ошибок, условиями, переменными — всё это позволяет реализовать сложную бизнес-логику на стороне сервера.

Процедура возвращает только указанные поля из таблицы users, что более явно и удобно для работы в консоли рабочей среды MySQL.

DELIMITER //
 
CREATE PROCEDURE GetUsersMainFields()
BEGIN
    SELECT id, name, email FROM users;
END//
 
DELIMITER ;

Для вызова этой процедуры используйте команду:

CALL GetUsersMainFields();

Заключение

Хранимые процедуры, функции и триггеры — ключевые инструменты автоматизации и повышения безопасности работы с современными реляционными СУБД. Они позволяют выносить бизнес-логику на уровень базы данных, обеспечивать целостность данных, ускорять обработку запросов и минимизировать ошибки при выполнении часто повторяющихся операций.

В PostgreSQL и MySQL подходы к созданию и использованию хранимых объектов имеют свои особенности, но в обоих случаях они значительно расширяют возможности администрирования, обработки данных и интеграции между приложениями и базой. Правильное использование процедур и триггеров делает проект более удобным для поддержки, масштабирования и аудита.