Тригери
Тригери у базах даних — це спеціальні типи збережених процедур, які автоматично виконуються або спрацьовують у відповідь на певні події чи дії, що відбуваються в базі даних.
Ці події можуть включати вставку, оновлення або видалення даних у таблицях, а також зміни об'єктів схеми бази даних, таких як таблиці чи подання.
Note
Тригери не можуть бути викликані користувачами явно. Вони автоматично виконуються у відповідь на операції, з якими вони пов'язані.
DML-тригери
DML-тригер (Data Manipulation Language trigger) — це об'єкт бази даних, який автоматично виконує вказану дію при настанні певної події над таблицею або поданням.
DML-тригери часто використовуються для забезпечення бізнес-правил, підтримки цілісності даних або виконання аудиторських завдань.
Типи DML-тригерів
- After-тригери: ці тригери спрацьовують після виконання дії (insert, update, delete) над таблицею;
- Before-тригери: ці тригери спрацьовують до виконання дії. Вони дозволяють перехопити початкову дію та виконати власну логіку перед тим, як вирішити, чи виконувати початкову дію.
Приклад after-тригера
Раніше ми розглядали приклад використання транзакції для додавання значень у таблиці BankAccounts
та UserLogs
як єдиної логічної одиниці у першому розділі цього курсу.
Тепер, замість використання транзакції, ми можемо досягти цього, створивши AFTER
-тригер на операцію INSERT
у таблиці BankAccounts
.
У результаті ми зможемо додавати лише нові рахунки, а відповідне значення журналу буде автоматично додано тригером.
-- Create an after-insert trigger for UserLogs
CREATE FUNCTION after_insert_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
-- Perform some action, like logging the insert
INSERT INTO UserLogs (account_number, action)
VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Attach the trigger to the BankAccounts table
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE after_insert_trigger_function();
Note
У тригерах PostgreSQL
NEW
— це спеціальна змінна-запис, яка представляє новий рядок, вставлений або оновлений у таблиці. Вона дозволяє отримати доступ до значень стовпців нового рядка всередині функції тригера.
Якщо ми працюємо з видаленими рядками, потрібно використовувати змінну-записOLD
замістьNEW
.
Приклад before-тригера
Припустимо, ми хочемо запобігти додаванню значень із від'ємним балансом рахунку. Для цього можна створити BEFORE
-тригер. Цей тригер перевірятиме баланс перед виконанням операції, і якщо він від'ємний, операція не буде виконана.
-- Create the trigger function
CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$
BEGIN
-- Check if the account balance is less than 0
IF (NEW.balance < 0) THEN
-- If balance is less than 0, do nothing and return
RAISE NOTICE 'Balance is less than 0. Action not logged.';
ELSE
-- If balance is greater than or equal to 0, log the action
RAISE NOTICE 'Logging insert into UserLogs';
-- Inserting into the UserLogs table
INSERT INTO UserLogs (account_number, action)
VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder));
END IF;
-- Indicate that the trigger function has completed successfully
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- Create the trigger
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE before_insert_trigger_function();
Шаблон створення тригерів
Можна виділити типовий шаблон створення тригерів: спочатку визначається функція, яка виконує певну логіку до або після операції. Далі цю функцію асоціюють як тригер із заданою таблицею та дією.
Зверніть увагу, що в операторі:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
є можливість використовувати UPDATE
або DELETE
замість операції INSERT
.
Але зверніть увагу, що не можна створювати тригери для SELECT
, оскільки оператор SELECT
не змінює жодного рядка в таблиці!
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 4.35
Тригери
Свайпніть щоб показати меню
Тригери у базах даних — це спеціальні типи збережених процедур, які автоматично виконуються або спрацьовують у відповідь на певні події чи дії, що відбуваються в базі даних.
Ці події можуть включати вставку, оновлення або видалення даних у таблицях, а також зміни об'єктів схеми бази даних, таких як таблиці чи подання.
Note
Тригери не можуть бути викликані користувачами явно. Вони автоматично виконуються у відповідь на операції, з якими вони пов'язані.
DML-тригери
DML-тригер (Data Manipulation Language trigger) — це об'єкт бази даних, який автоматично виконує вказану дію при настанні певної події над таблицею або поданням.
DML-тригери часто використовуються для забезпечення бізнес-правил, підтримки цілісності даних або виконання аудиторських завдань.
Типи DML-тригерів
- After-тригери: ці тригери спрацьовують після виконання дії (insert, update, delete) над таблицею;
- Before-тригери: ці тригери спрацьовують до виконання дії. Вони дозволяють перехопити початкову дію та виконати власну логіку перед тим, як вирішити, чи виконувати початкову дію.
Приклад after-тригера
Раніше ми розглядали приклад використання транзакції для додавання значень у таблиці BankAccounts
та UserLogs
як єдиної логічної одиниці у першому розділі цього курсу.
Тепер, замість використання транзакції, ми можемо досягти цього, створивши AFTER
-тригер на операцію INSERT
у таблиці BankAccounts
.
У результаті ми зможемо додавати лише нові рахунки, а відповідне значення журналу буде автоматично додано тригером.
-- Create an after-insert trigger for UserLogs
CREATE FUNCTION after_insert_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
-- Perform some action, like logging the insert
INSERT INTO UserLogs (account_number, action)
VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Attach the trigger to the BankAccounts table
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE after_insert_trigger_function();
Note
У тригерах PostgreSQL
NEW
— це спеціальна змінна-запис, яка представляє новий рядок, вставлений або оновлений у таблиці. Вона дозволяє отримати доступ до значень стовпців нового рядка всередині функції тригера.
Якщо ми працюємо з видаленими рядками, потрібно використовувати змінну-записOLD
замістьNEW
.
Приклад before-тригера
Припустимо, ми хочемо запобігти додаванню значень із від'ємним балансом рахунку. Для цього можна створити BEFORE
-тригер. Цей тригер перевірятиме баланс перед виконанням операції, і якщо він від'ємний, операція не буде виконана.
-- Create the trigger function
CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$
BEGIN
-- Check if the account balance is less than 0
IF (NEW.balance < 0) THEN
-- If balance is less than 0, do nothing and return
RAISE NOTICE 'Balance is less than 0. Action not logged.';
ELSE
-- If balance is greater than or equal to 0, log the action
RAISE NOTICE 'Logging insert into UserLogs';
-- Inserting into the UserLogs table
INSERT INTO UserLogs (account_number, action)
VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder));
END IF;
-- Indicate that the trigger function has completed successfully
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- Create the trigger
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE before_insert_trigger_function();
Шаблон створення тригерів
Можна виділити типовий шаблон створення тригерів: спочатку визначається функція, яка виконує певну логіку до або після операції. Далі цю функцію асоціюють як тригер із заданою таблицею та дією.
Зверніть увагу, що в операторі:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
є можливість використовувати UPDATE
або DELETE
замість операції INSERT
.
Але зверніть увагу, що не можна створювати тригери для SELECT
, оскільки оператор SELECT
не змінює жодного рядка в таблиці!
Дякуємо за ваш відгук!