PostgreSQL Триггеры: создание, список и удаление с примером

⚡ Умное резюме

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

  • Определение: Триггер — это функция, которая автоматически вызывается при возникновении события в базе данных, такого как INSERT, UPDATE или DELETE.
  • 🔁 Объем: Цикл FOR EACH ROW запускает триггер один раз для каждой затронутой строки, а цикл FOR EACH STATEMENT — один раз для каждой операции.
  • 🇧🇷 Создайте: Команда CREATE TRIGGER привязывает функцию к таблице и устанавливает временные параметры BEFORE, AFTER или INSTEAD OF.
  • 📋 Список: Чтобы увидеть все триггеры в базе данных, выполните запрос к каталогу pg_trigger с помощью команды SELECT tgname.
  • 🇧🇷 Бросьте: DROP TRIGGER удаляет триггер, а IF EXISTS предотвращает ошибку, если он отсутствует.
  • 🤖 Помощь в использовании ИИ: Искусственный интеллект-ассистенты генерируют триггерные функции и предлагают варианты времени ДО или ПОСЛЕ на основе запроса, заданного простым языком.

PostgreSQL Триггеры

Что такое триггер PostgreSQL?

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

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

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

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

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

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

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

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

Имя события — это имя события, которое вызовет вызов триггера. Это может быть ВСТАВИТЬ, ОБНОВЛЕНИЕ, УДАЛЕНИЕ и т. д.

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

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

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

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

PostgreSQL Создать пример триггера

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

Цена:

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

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

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();

Вставим новую запись в таблицу Price:

INSERT INTO Price
VALUES (3, 400);

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

SELECT * FROM Price_Audits;

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

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

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

PostgreSQL Список триггеров

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

SELECT tgname FROM pg_trigger;

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

PostgreSQL Список триггеров

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

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

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

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

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

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

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

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

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

Например:

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

DROP TRIGGER example_trigger IF EXISTS
ON Company;

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

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

Как создать триггер в PostgreSQL используя pgAdmin

Вот как можно создать триггер в PostgreSQL используя pgAdmin:

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

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

Шаг 2) Создайте демонстрационную базу данных

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

Создать триггер в PostgreSQL используя pgAdmin

Шаг 3) Введите запрос

Для создания таблицы Price_Audits введите запрос в редакторе:

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

Шаг 4) Выполните запрос

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

Создать триггер в PostgreSQL используя pgAdmin

Шаг 5) Запустите Code для функции аудита

Запустите следующий код, чтобы определить функцию 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) Запустите Code создать триггер

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

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

Шаг 7) Вставьте новую запись

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

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

Создать триггер в PostgreSQL используя pgAdmin

Шаг 8) Проверьте содержимое таблицы

Давайте проверим содержимое таблицы Price_Audits.

Листинг триггеров с помощью pgAdmin

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

SELECT tgname FROM pg_trigger

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

Листинг триггеров с помощью pgAdmin

Падениеping Триггеры с использованием pgAdmin

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

DROP TRIGGER example_trigger IF EXISTS
ON Company

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

Часто задаваемые вопросы (FAQ)

Триггер BEFORE срабатывает до записи изменений в строку, поэтому он может изменить или отклонить строку. Триггер AFTER срабатывает после сохранения изменений и подходит для задач ведения журналов и аудита.

Триггер INSTEAD OF определяется для представления, а не для таблицы. Он заменяет операции INSERT, UPDATE или DELETE на пользовательскую логику, делая представление, доступное только для чтения, доступным для записи.

Функции-триггеры обычно пишутся на PL/pgSQL. PostgreSQL также поддерживает PL/PythonPL/Perl, PL/Tcl и C, так что вы можете выбрать язык, который соответствует вашей логике.

Используйте команду ALTER TABLE table-name DISABLE TRIGGER trigger-name, чтобы отключить его, и ENABLE TRIGGER, чтобы снова включить. Это предотвратит удаление таблицы.ping и повторное создание триггера во время массовой загрузки.

Да. Каждый триггер добавляет нагрузку к каждой затронутой строке или оператору, поэтому сложная логика триггеров может замедлить запись. Делайте функции триггеров короткими и индексируйте все столбцы, к которым они обращаются.

Да. Если триггер изменяет данные в другой таблице, которая также содержит триггеры, то и они срабатывают, создавая каскадные триггеры. PostgreSQL ограничивает глубину вложенности, чтобы предотвратить бесконечные циклы.

Искусственный интеллект, используемый в качестве помощника при программировании, преобразует запрос на простом языке в полноценный оператор CREATE TRIGGER и функцию-триггер, предлагает варианты времени выполнения BEFORE или AFTER и объясняет сгенерированный код PL/pgSQL для быстрого ознакомления.

Да. Такие инструменты, как pgai и помощники на основе GPT, преобразуют описанное правило в SQL-запросы для триггеров и могут создавать триггеры INSERT, которые автоматически помечают или проверяют новые данные по мере их поступления.

Подведем итог этой публикации следующим образом: