Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Тригери | Деякі Додаткові Теми
Просунуті Техніки в SQL

bookТригери

Тригери у базах даних — це спеціальні типи збережених процедур, які автоматично виконуються або спрацьовують у відповідь на певні події чи дії, що відбуваються в базі даних.
Ці події можуть включати вставку, оновлення або видалення даних у таблицях, а також зміни об'єктів схеми бази даних, таких як таблиці чи подання.

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 не змінює жодного рядка в таблиці!

question mark

Яке основне призначення використання тригерів у базі даних?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

Can you explain the difference between AFTER and BEFORE triggers in more detail?

What are some common use cases for DML triggers in real-world applications?

How do I prevent unwanted actions using triggers in PostgreSQL?

Awesome!

Completion rate improved to 4.35

bookТригери

Свайпніть щоб показати меню

Тригери у базах даних — це спеціальні типи збережених процедур, які автоматично виконуються або спрацьовують у відповідь на певні події чи дії, що відбуваються в базі даних.
Ці події можуть включати вставку, оновлення або видалення даних у таблицях, а також зміни об'єктів схеми бази даних, таких як таблиці чи подання.

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 не змінює жодного рядка в таблиці!

question mark

Яке основне призначення використання тригерів у базі даних?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1
some-alt