PostgreSQL Utløsere: Opprett, liste og slipp med eksempel

⚡ Smart oppsummering

PostgreSQL Utløsere er funksjoner som kjører automatisk når en INSERT-, UPDATE- eller DELETE-hendelse utløses på en tabell, slik at databasen kan håndheve regler, logge endringer og revidere data uten ekstra applikasjonskode.

  • Definisjon: En trigger er en funksjon som kalles automatisk ved en databasehendelse, for eksempel INSERT, UPDATE eller DELETE.
  • 🔁 Omfang: FOR EACH ROW kjører utløseren én gang per berørte rad, mens FOR EACH STATION kjører den én gang per operasjon.
  • 🛠️ Skape: CREATE TRIGGER binder en funksjon til en tabell og setter timingen FØR, ETTER eller I STEDET FOR.
  • ???? Liste: Spør pg_trigger-katalogen med SELECT tgname for å se alle triggere i databasen.
  • 🗑️ Miste: DROP TRIGGER fjerner en trigger, og IF EXISTS forhindrer en feil når den mangler.
  • 🤖 AI-hjelp: AI-assistenter genererer triggerfunksjoner og foreslår FØR- eller ETTER-timing fra en forespørsel i et enkelt språk.

PostgreSQL triggere

Hva er Trigger i PostgreSQL?

A PostgreSQL Avtrekker er en funksjon som utløses automatisk når en databasehendelse oppstår på et databaseobjekt, for eksempel en tabell. Eksempler på databasehendelser som kan aktivere en utløser inkluderer INSERT, UPDATE, DELETE osv. Dessuten, når du oppretter en utløser for en tabell, vil utløseren bli fjernet automatisk når tabellen slettes.

Hvordan Trigger brukes i PostgreSQL?

En trigger kan merkes med FOR EACH ROW-operatoren under opprettelsen. En slik trigger vil bli kalt én gang for hver rad som endres av operasjonen. En trigger kan også merkes med FOR EACH STATEM-operatoren under opprettelsen. Denne triggeren vil bare bli utført én gang for en spesifikk operasjon.

PostgreSQL Lag Trigger

For å lage en trigger bruker vi CREATE TRIGGER-funksjonen. Her er syntaksen for funksjonen:

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

Triggernavnet er navnet på utløseren.

FØR, ETTER og I stedet for er nøkkelord som bestemmer når utløseren vil bli påkalt.

Hendelsesnavnet er navnet på hendelsen som vil føre til at utløseren blir påkalt. Dette kan være INSERT, OPPDATERING, SLETT osv.

Tabellnavnet er navnet på tabellen som utløseren skal opprettes på.

Hvis triggeren skal opprettes for en INSERT-operasjon, må vi legge til parameteren ON kolonnenavn.

Følgende syntaks demonstrerer dette:

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

PostgreSQL Lag triggereksempel

Vi vil bruke pristabellen nedenfor:

Pris:

PostgreSQL Lag Trigger

La oss lage en annen tabell, Price_Audits, der vi vil logge endringene som er gjort i pristabellen:

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

Vi kan nå definere en ny funksjon kalt 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;

Funksjonen ovenfor vil sette inn en post i tabellen Pris_revisjon, inkludert den nye rad-IDen og tidspunktet posten er opprettet.

Nå som vi har triggerfunksjonen, bør vi binde den til vår Price-tabell. Vi gir triggeren navnet price_trigger. Før en ny post opprettes, vil triggerfunksjonen automatisk bli kalt for å logge endringene. Her er triggeren:

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

La oss sette inn en ny post i pristabellen:

INSERT INTO Price
VALUES (3, 400);

Nå som vi har satt inn en post i Price-tabellen, bør en post også settes inn i Price_Audits-tabellen på grunn av utløseren vi opprettet. La oss sjekke dette:

SELECT * FROM Price_Audits;

Dette vil returnere følgende:

PostgreSQL Lag Trigger

Utløseren fungerte vellykket.

PostgreSQL Listeutløser

Alle triggere du oppretter i PostgreSQL er lagret i pg_trigger-tabellen. For å se listen over utløsere du har på database, spør i tabellen ved å kjøre SELECT-kommandoen som vist nedenfor:

SELECT tgname FROM pg_trigger;

Dette returnerer følgende:

PostgreSQL Listeutløser

tgname-kolonnen i pg_trigger-tabellen angir navnet på utløseren.

PostgreSQL Slipp utløseren

Når en utløser ikke lenger er nødvendig, kan du fjerne den like enkelt. For å slippe en PostgreSQL trigger, bruker vi DROP TRIGGER-setningen med følgende syntaks:

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

Trigger-name-parameteren angir navnet på triggeren som skal slettes.

Tabellnavnet angir navnet på tabellen som utløseren skal slettes fra.

IF EXISTS-leddet forsøker å slette en trigger som eksisterer. Hvis du prøver å slette en trigger som ikke eksisterer uten å bruke IF EXISTS-klausulen, får du en feilmelding.

CASCADE-alternativet vil hjelpe deg å slippe alle objekter som er avhengige av triggeren automatisk.

Hvis du bruker RESTRICT-alternativet, vil ikke utløseren slettes hvis objekter er avhengige av den.

For eksempel:

For å slippe triggeren som heter example_trigger på tabellen Company, kjør følgende kommando:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Bruker pgAdmin

La oss nå se hvordan alle tre handlingene utføres ved hjelp av pgAdmin.

Hvordan lage trigger i PostgreSQL ved å bruke pgAdmin

Slik kan du opprette en trigger i PostgreSQL bruker pgAdmin:

Trinn 1) Logg på pgAdmin-kontoen din

Åpne pgAdmin og logg inn på kontoen din med påloggingsinformasjonen din.

Trinn 2) Opprett en demodatabase

  1. Fra navigasjonslinjen til venstre klikker du på Databaser.
  2. Klikk på Demo.

Opprett trigger i PostgreSQL ved å bruke pgAdmin

Trinn 3) Skriv inn spørringen

For å opprette tabellen Price_Audits, skriv inn spørringen i redigeringsprogrammet:

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

Trinn 4) Utfør spørringen

Klikk på Utfør-knappen.

Opprett trigger i PostgreSQL ved å bruke pgAdmin

Trinn 5) Kjør Code for revisjonsfunksjon

Kjør følgende kode for å definere funksjonen 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

Trinn 6) Kjør Code å lage trigger

Kjør følgende kode for å opprette trigger price_trigger:

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

Trinn 7) Sett inn en ny post

  1. Kjør følgende kommando for å sette inn en ny post i pristabellen:
INSERT INTO Price
VALUES (3, 400)
  1. Kjør følgende kommando for å sjekke om en post ble satt inn i tabellen Price_Audits:
SELECT * FROM Price_Audits

Dette bør returnere følgende:

Opprett trigger i PostgreSQL ved å bruke pgAdmin

Trinn 8) Sjekk tabellinnholdet

La oss sjekke innholdet i Price_Audits-tabellen.

Oppføringstriggere ved hjelp av pgAdmin

Trinn 1) Kjør følgende kommando for å sjekke utløsere i databasen din:

SELECT tgname FROM pg_trigger

Dette returnerer følgende:

Oppføringstriggere ved hjelp av pgAdmin

Dropping Utløsere ved bruk av pgAdmin

For å slippe triggeren som heter example_trigger på tabellen Company, kjør følgende kommando:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Last ned databasen som brukes i denne opplæringen

Spørsmål og svar

En BEFORE-trigger kjører før radendringen skrives, slik at den kan endre eller avvise raden. En AFTER-trigger kjører etter at endringen er lagret, noe som passer for logging og revisjonsoppgaver.

En INSTEAD OF-utløser defineres på en visning, ikke en tabell. Den erstatter INSERT, UPDATE eller DELETE med tilpasset logikk, noe som gjør en skrivebeskyttet visning skrivbar.

Triggerfunksjoner skrives vanligvis i PL/pgSQL. PostgreSQL støtter også PL/Python, PL/Perl, PL/Tcl og C, slik at du kan velge språket som passer din logikk.

Bruk ALTER TABLE table-name DISABLE TRIGGER trigger-name for å slå den av, og ENABLE TRIGGER for å slå den på igjen. Dette unngår slipp.ping og gjenskape avtrekkeren under bulklastinger.

Ja. Hver trigger legger til arbeid til hver berørte rad eller setning, så tung triggerlogikk kan redusere skrivingen. Hold triggerfunksjonene korte og indekser alle kolonner de spør om.

Ja. Hvis en utløser endrer en annen tabell som også har utløsere, utløses disse også, og det opprettes kaskaderende utløsere. PostgreSQL begrenser nestedybden for å forhindre uendelige løkker.

AI-kodingsassistenter gjør en forespørsel i enkeltspråk om til en komplett CREATE TRIGGER-setning og utløserfunksjon, foreslår FØR- eller ETTER-timing og forklarer den genererte PL/pgSQL-en for rask gjennomgang.

Ja. Verktøy som pgai og GPT-baserte assistenter oversetter en beskrevet regel til trigger-SQL, og kan bygge INSERT-triggere som automatisk tagger eller validerer nye data når de ankommer.

Oppsummer dette innlegget med: