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 Тригерите

В какво е Trigger PostgreSQL?

A PostgreSQL Тригер е функция, която се задейства автоматично, когато възникне събитие в базата данни върху обект от базата данни, например таблица. Примери за събития в базата данни, които могат да активират тригер, включват INSERT, UPDATE, DELETE и др. Освен това, когато създавате тригер за таблица, той ще бъде премахнат автоматично, когато тази таблица бъде изтрита.

Как се използва Trigger в PostgreSQL?

Тригер може да бъде маркиран с оператора FOR EACH ROW по време на създаването си. Такъв тригер ще бъде извикан веднъж за всеки ред, модифициран от операцията. Тригер може също да бъде маркиран с оператора FOR EACH STATEMENT по време на създаването си. Този тригер ще бъде изпълнен само веднъж за конкретна операция.

PostgreSQL Създайте Trigger

За да създадем тригер, използваме функцията CREATE TRIGGER. Ето синтаксиса на функцията:

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

Името на тригера е името на тригера.

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

Името на събитието е името на събитието, което ще доведе до извикване на тригера. Това може да бъде INSERT, АКТУАЛИЗИРАНЕ, ИЗТРИВАНЕ и др.

Името на таблицата е името на таблицата, върху която трябва да бъде създаден тригерът.

Ако тригерът трябва да бъде създаден за операция INSERT, трябва да добавим параметъра ON име на колона.

Следният синтаксис демонстрира това:

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

PostgreSQL Пример за създаване на тригер

Ще използваме таблицата с цените, дадена по-долу:

Цена:

PostgreSQL Създайте Trigger

Нека създадем друга таблица, 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). Ще дадем на тригера името price_trigger. Преди да се създаде нов запис, функцията за задействане ще бъде извикана автоматично, за да регистрира промените. Ето го тригерът:

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

Нека вмъкнем нов запис в ценовата таблица:

INSERT INTO Price
VALUES (3, 400);

След като добавихме запис в таблицата Price, трябва да добавим запис и в таблицата Price_Audits, заради създадения от нас тригер. Нека проверим това:

SELECT * FROM Price_Audits;

Това ще върне следното:

PostgreSQL Създайте Trigger

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

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

Изтеглете базата данни, използвана в този урок

Въпроси и Отговори

Тригер BEFORE се изпълнява преди записването на промяната в реда, така че може да я модифицира или отхвърли. Тригер AFTER се изпълнява след запазването на промяната, което е подходящо за задачи по регистриране и одит.

Тригер INSTEAD OF е дефиниран за изглед, а не за таблица. Той замества INSERT, UPDATE или DELETE с персонализирана логика, което прави изглед само за четене и достъпен за запис.

Тригерните функции обикновено се пишат на PL/pgSQL. PostgreSQL също поддържа PL/Python, PL/Perl, PL/Tcl и C, така че можете да изберете езика, който отговаря на вашата логика.

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

Да. Всеки тригер добавя работа към всеки засегнат ред или оператор, така че тежката логика на тригерите може да забави записа. Поддържайте тригерните функции кратки и индексирайте всички колони, към които те отправят заявки.

Да. Ако даден тригер промени друга таблица, която също има тригери, те също се задействат, създавайки каскадни тригери. PostgreSQL ограничава дълбочината на влагане, за да предотврати безкрайни цикли.

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

Да. Инструменти като pgai и асистенти, базирани на GPT, преобразуват описано правило в SQL код за задействане и могат да създават INSERT задействания, които автоматично маркират или валидират нови данни, когато постъпят.

Обобщете тази публикация с: