PostgreSQL Declanșatoare: creați, enumerați și aruncați cu exemplu

⚡ Rezumat inteligent

PostgreSQL Declanșatoarele sunt funcții care rulează automat atunci când un eveniment INSERT, UPDATE sau DELETE se declanșează asupra unui tabel, permițând bazei de date să aplice reguli, să înregistreze modificările și să auditeze datele fără cod suplimentar al aplicației.

  • ⚡ Definiție: Un trigger este o funcție invocată automat la un eveniment în baza de date, cum ar fi INSERT, UPDATE sau DELETE.
  • 🔁 Domeniu de aplicare: FOR EACH ROW rulează declanșatorul o dată per rând afectat, în timp ce FOR EACH STATEMENT îl rulează o dată per operație.
  • 🛠️ Crea: CREATE TRIGGER leagă o funcție de un tabel și setează temporizarea BEFORE, AFTER sau INSTEAD OF.
  • 📋 Listă: Interogați catalogul pg_trigger cu comanda SELECT tgname pentru a vedea fiecare declanșator din baza de date.
  • 🗑️ Cădere brusca: DROP TRIGGER elimină un declanșator, iar IF EXISTS previne o eroare atunci când acesta lipsește.
  • 🤖 Ajutor AI: Asistenții inteligenți artificiali generează funcții de declanșare și sugerează ÎNAINTE sau DUPĂ sincronizare dintr-o solicitare în limbaj simplu.

PostgreSQL Declanșările

În ce este Trigger PostgreSQL?

A PostgreSQL trăgaci este o funcție care se declanșează automat atunci când are loc un eveniment în baza de date asupra unui obiect al bazei de date, de exemplu, un tabel. Exemple de evenimente în baza de date care pot activa un declanșator includ INSERT, UPDATE, DELETE etc. Mai mult, atunci când creați un declanșator pentru un tabel, declanșatorul va fi eliminat automat atunci când tabelul respectiv este șters.

Cum se utilizează Trigger în PostgreSQL?

Un declanșator poate fi marcat cu operatorul FOR EACH ROW în timpul creării sale. Un astfel de declanșator va fi apelat o singură dată pentru fiecare rând modificat de operație. De asemenea, un declanșator poate fi marcat cu operatorul FOR EACH STATEMENT în timpul creării sale. Acest declanșator va fi executat o singură dată pentru o anumită operație.

PostgreSQL Creați declanșator

Pentru a crea un declanșator, folosim funcția CREATE TRIGGER. Iată sintaxa funcției:

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

Numele declanșatorului este numele declanșatorului.

ÎNAINTE, DUPĂ și ÎNLOC DE sunt cuvinte cheie care determină când va fi invocat declanșatorul.

Numele evenimentului este numele evenimentului care va determina invocarea declanșatorului. Acesta poate fi INSERT, UPDATE, DELETE etc.

Numele tabelului este numele tabelului pe care urmează să fie creat declanșatorul.

Dacă declanșatorul urmează să fie creat pentru o operație INSERT, trebuie să adăugăm parametrul ON column-name.

Următoarea sintaxă demonstrează acest lucru:

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

PostgreSQL Creare exemplu de declanșare

Vom folosi tabelul de prețuri de mai jos:

Preț:

PostgreSQL Creați declanșator

Să creăm un alt tabel, Price_Audits, unde vom înregistra modificările făcute în tabelul Price:

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

Acum putem defini o nouă funcție numită 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;

Funcția de mai sus va insera o înregistrare în tabelul Price_Audits, inclusiv noul ID de rând și ora în care este creată înregistrarea.

Acum că avem funcția de declanșare, ar trebui să o legăm de tabelul nostru Price. Vom da declanșatorului numele price_trigger. Înainte de a fi creată o nouă înregistrare, funcția de declanșare va fi invocată automat pentru a înregistra modificările. Iată declanșatorul:

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

Să introducem o nouă înregistrare în tabelul de prețuri:

INSERT INTO Price
VALUES (3, 400);

Acum că am introdus o înregistrare în tabelul Price, o altă înregistrare ar trebui introdusă și în tabelul Price_Audits, datorită declanșatorului pe care l-am creat. Să verificăm următoarele:

SELECT * FROM Price_Audits;

Aceasta va returna următoarele:

PostgreSQL Creați declanșator

Declanșatorul a funcționat cu succes.

PostgreSQL Declanșator listă

Toate declanșatoarele în care creați PostgreSQL sunt stocate în tabelul pg_trigger. Pentru a vedea lista de declanșatoare pe care le aveți pe Baza de date, interogați tabelul rulând comanda SELECT așa cum se arată mai jos:

SELECT tgname FROM pg_trigger;

Aceasta returnează următoarele:

PostgreSQL Declanșator listă

Coloana tgname a tabelului pg_trigger denotă numele declanșatorului.

PostgreSQL Declanșator de declanșare

Când un declanșator nu mai este necesar, îl puteți elimina la fel de ușor. Pentru a renunța la un PostgreSQL declanșator, folosim instrucțiunea DROP TRIGGER cu următoarea sintaxă:

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

Parametrul declanșator-name denotă numele declanșatorului care urmează să fie șters.

Numele tabelului denotă numele tabelului din care declanșatorul urmează să fie șters.

Clauza IF EXISTS încearcă să șteargă un declanșator care există. Dacă încercați să ștergeți un declanșator care nu există fără a utiliza clauza IF EXISTS, veți primi o eroare.

Opțiunea CASCADE vă va ajuta să aruncați automat toate obiectele care depind de declanșare.

Dacă utilizați opțiunea RESTRICT, declanșatorul nu va fi șters dacă obiectele depind de el.

De exemplu:

Pentru a arunca declanșatorul numit example_trigger pe tabelul Company, rulați următoarea comandă:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Folosind pgAdmin

Acum să vedem cum sunt efectuate toate cele trei acțiuni folosind pgAdmin.

Cum se creează declanșatorul în PostgreSQL folosind pgAdmin

Iată cum puteți crea un declanșator în PostgreSQL folosind pgAdmin:

Pasul 1) Conectați-vă la contul dvs. pgAdmin

Deschide pgAdmin și conectează-te la contul tău folosind datele de autentificare.

Pasul 2) Creați o bază de date demonstrativă

  1. Din bara de navigare din stânga, faceți clic pe Baze de date.
  2. Faceți clic pe Demo.

Creați declanșatorul în PostgreSQL folosind pgAdmin

Pasul 3) Introduceți interogarea

Pentru a crea tabelul Price_Audits, introduceți interogarea în editor:

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

Pasul 4) Executați interogarea

Faceți clic pe butonul Execute.

Creați declanșatorul în PostgreSQL folosind pgAdmin

Pasul 5) Rulați Code pentru auditfunc

Rulați următorul cod pentru a defini funcția 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

Pasul 6) Rulați Code pentru a crea un declanșator

Rulați următorul cod pentru a crea declanșatorul price_trigger:

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

Pasul 7) Introduceți o nouă înregistrare

  1. Rulați următoarea comandă pentru a insera o înregistrare nouă în tabelul de prețuri:
INSERT INTO Price
VALUES (3, 400)
  1. Rulați următoarea comandă pentru a verifica dacă a fost introdusă o înregistrare în tabelul Price_Audits:
SELECT * FROM Price_Audits

Aceasta ar trebui să returneze următoarele:

Creați declanșatorul în PostgreSQL folosind pgAdmin

Pasul 8) Verificați conținutul tabelului

Să verificăm conținutul tabelului Price_Audits.

Listarea declanșatorilor folosind pgAdmin

Pas 1) Rulați următoarea comandă pentru a verifica declanșatoarele din baza de date:

SELECT tgname FROM pg_trigger

Aceasta returnează următoarele:

Listarea declanșatorilor folosind pgAdmin

Picăturăping Declanșatoare folosind pgAdmin

Pentru a arunca declanșatorul numit example_trigger pe tabelul Company, rulați următoarea comandă:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Descărcați baza de date folosită în acest tutorial

Întrebări frecvente

Un declanșator BEFORE rulează înainte de scrierea modificării rândului, astfel încât poate modifica sau respinge rândul. Un declanșator AFTER rulează după ce modificarea este salvată, fiind potrivit pentru activitățile de înregistrare în jurnal și audit.

Un declanșator INSTEAD OF este definit într-o vizualizare, nu într-un tabel. Acesta înlocuiește INSERT, UPDATE sau DELETE cu o logică personalizată, făcând o vizualizare doar pentru citire (read-only) accesibilă prin scriere.

Funcțiile de declanșare sunt de obicei scrise în PL/pgSQL. PostgreSQL susține și PL/Python, PL/Perl, PL/Tcl și C, astfel încât să puteți alege limbajul care se potrivește logicii dumneavoastră.

Folosește ALTER TABLE nume-tabelă DISABLE TRIGGER nume-declanșator pentru a-l dezactiva și ENABLE TRIGGER pentru a-l reactiva. Acest lucru evită pierderea de date.ping și recrearea declanșatorului în timpul încărcărilor în vrac.

Da. Fiecare declanșator adaugă efort fiecărui rând sau instrucțiune afectată, așadar logica declanșatoare complexă poate încetini scrierile. Mențineți funcțiile declanșatoare scurte și indexați orice coloană pe care o interoghează.

Da. Dacă un declanșator modifică un alt tabel care are, de asemenea, declanșatoare, și acestea se declanșează, creând declanșatoare în cascadă. PostgreSQL limitează adâncimea de imbricare pentru a preveni buclele infinite.

Asistenții de codare bazați pe inteligență artificială transformă o cerere în limbaj simplu într-o instrucțiune CREATE TRIGGER completă și o funcție de declanșare, sugerează temporizarea BEFORE sau AFTER și explică codul PL/pgSQL generat pentru o recapitulare rapidă.

Da. Instrumente precum pgai și asistenții bazați pe GPT traduc o regulă descrisă în cod SQL de declanșare și pot construi declanșatoare INSERT care etichetează sau validează automat datele noi pe măsură ce acestea sosesc.

Rezumați această postare cu: