Учебники

20) PostgreSQL Trigger

Что такое триггеры Postgresql?

Триггер PostgreSQL — это функция, которая запускается автоматически при возникновении события базы данных в объекте базы данных. Например, стол.

Примеры событий базы данных, которые могут активировать триггер, включают INSERT, UPDATE, DELETE и т. Д. Кроме того, когда вы создаете триггер для таблицы, триггер автоматически сбрасывается при удалении этой таблицы.

В этом руководстве по PostgreSQL вы узнаете следующее:

Как триггер используется в POSRGREQL?

Триггер может быть помечен оператором FOR EACH ROW при его создании. Такой триггер будет вызываться один раз для каждой строки, измененной операцией. Триггер также может быть помечен оператором FOR EACH STATEMENT во время его создания. Этот триггер будет выполнен только один раз для конкретной операции.

Создание триггера

Чтобы создать триггер, мы используем функцию CREATE TRIGGER. Вот синтаксис для функции:

	
CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name  
ON table-name  
[  
 -- Trigger logic  
];  

Имя триггера — это имя триггера.

BEFORE, AFTER и INSTEAD OF — это ключевые слова, которые определяют, когда будет активирован триггер.

Имя-события — это имя события, которое вызовет запуск триггера. Это может быть INSERT, UPDATE, DELETE и т. Д.

Имя таблицы — это имя таблицы, для которой должен быть создан триггер.

Если триггер должен быть создан для операции INSERT, мы должны добавить параметр ON column-name.

Следующий синтаксис демонстрирует это:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name  
ON table-name  
[  
 -- Trigger logic
];  

Например:

Мы будем использовать таблицу цен, приведенную ниже:

Цена:

Давайте создадим еще одну таблицу Price_Audits, где мы будем регистрировать изменения, внесенные в таблицу Price:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

Теперь мы можем определить новую функцию с именем auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

Вышеупомянутая функция вставит запись в таблицу Price_Audits, включая новый идентификатор строки и время создания записи.

Теперь, когда у нас есть триггерная функция, мы должны привязать ее к нашей таблице цен. Мы дадим триггеру имя Price_trigger. Перед созданием новой записи автоматически запускается функция триггера для регистрации изменений. Вот триггер:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

Давайте вставим новую запись в таблицу цен:

INSERT INTO Price 
VALUES (3, 400);

Теперь, когда мы вставили запись в таблицу Price, запись также должна быть вставлена ​​в таблицу Price_Audit. Это будет результатом триггера, который мы создали в таблице цен. Давайте проверим это:

SELECT * FROM Price_Audits;

Это вернет следующее:

Триггер сработал успешно.

Перечисление триггеров

Все триггеры, которые вы создаете в PostgreSQL, хранятся в таблице pg_trigger. Чтобы просмотреть список триггеров, имеющихся в базе данных, выполните запрос к таблице, выполнив команду SELECT, как показано ниже:

SELECT tgname FROM pg_trigger;   

Это возвращает следующее:

Столбец tgname таблицы pg_trigger обозначает имя триггера.

Сбрасывание триггеров

Чтобы удалить триггер PostgreSQL, мы используем оператор DROP TRIGGER со следующим синтаксисом:

DROP TRIGGER [IF EXISTS] trigger-name 
ON table-name [ CASCADE | RESTRICT ];

Параметр имени триггера обозначает имя триггера, который должен быть удален.

Имя таблицы обозначает имя таблицы, из которой должен быть удален триггер.

Предложение IF EXISTS пытается удалить существующий триггер. Если вы попытаетесь удалить триггер, который не существует, без использования предложения IF EXISTS, вы получите ошибку.

Опция CASCADE поможет вам автоматически отбрасывать все объекты, которые зависят от триггера.

Если вы используете опцию RESTRICT, триггер не будет удален, если объекты зависят от него.

Например:

Чтобы удалить триггер с именем example_trigger для таблицы Price, мы запускаем следующую команду:

Чтобы удалить триггер с именем example_trigger в таблице Company, выполните следующую команду:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Использование pgAdmin

Теперь посмотрим, как все три действия выполняются с использованием pgAdmin.

Создание триггеров

Чтобы сделать то же самое через pgAdmin, сделайте это:

Шаг 1) Войдите в свою учетную запись pgAdmin.

Шаг 2)

  1. На панели навигации слева нажмите Базы данных.
  2. Нажмите Демо.

Шаг 3) Чтобы создать таблицу Price_Audits, введите редактор запросов:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

Шаг 4) Нажмите кнопку «Выполнить».

Шаг 5) Запустите следующий код, чтобы определить функцию auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

Шаг 6) Запустите следующий код, чтобы создать триггер price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

Шаг 7)

  1. Выполните следующую команду, чтобы вставить новую запись в таблицу цен:
    INSERT INTO Price
    VALUES (3, 400)
    
  2. Выполните следующую команду, чтобы проверить, была ли запись вставлена ​​в таблицу Price_Audits:
    SELECT * FROM Price_Audits
    

    Это должно вернуть следующее:

Шаг 8) Давайте проверим содержимое таблицы Price_Audits:

Перечисление триггеров

Шаг 1) Запустите следующую команду, чтобы проверить триггеры в вашей базе данных:

SELECT tgname FROM pg_trigger   

Это возвращает следующее:

Триггеры сброса

Чтобы удалить триггер с именем example_trigger в таблице Company, выполните следующую команду:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Резюме:

  • Триггер PostgreSQL относится к функции, которая запускается автоматически, когда событие базы данных происходит с объектом базы данных, таким как таблица.
  • Примеры таких событий базы данных включают INSERT, UPDATE, DELETE и т. Д.
  • Триггер существует только в течение времени жизни объекта базы данных, для которого он был создан.
  • Если объект базы данных удален, триггер также будет удален.
  • Триггеры PostgreSQL создаются с помощью оператора CREATE TRIGGER.
  • Каждый триггер связан с функцией, определяющей, что будет делать триггер при его вызове.

Загрузите базу данных, использованную в этом руководстве