PostgreSQL Utlösare: Skapa, lista och släpp med exempel

⚡ Smart sammanfattning

PostgreSQL Triggers är funktioner som körs automatiskt när en INSERT-, UPDATE- eller DELETE-händelse utlöses på en tabell, vilket gör att databasen kan tillämpa regler, logga ändringar och granska data utan extra applikationskod.

  • Definition: En trigger är en funktion som anropas automatiskt vid en databashändelse, till exempel INSERT, UPDATE eller DELETE.
  • 🔁 Omfattning: FOR EACH ROW kör utlösaren en gång per berörd rad, medan FOR EACH STATION kör den en gång per operation.
  • 🛠️ Skapa: CREATE TRIGGER binder en funktion till en tabell och anger timing FÖRE, EFTER eller ISTÄLLET FÖR.
  • 📋 Lista: Fråga pg_trigger-katalogen med SELECT tgname för att se alla triggers i databasen.
  • 🗑️ Släppa: DROP TRIGGER tar bort en trigger, och IF EXISTS förhindrar ett fel när den saknas.
  • 🤖 AI-hjälp: AI-assistenter genererar triggerfunktioner och föreslår FÖRE- eller EFTER-timing från en begäran i enkelt språk.

PostgreSQL triggers

Vad är Trigger i PostgreSQL?

A PostgreSQL Trigger är en funktion som utlöses automatiskt när en databashändelse inträffar på ett databasobjekt, till exempel en tabell. Exempel på databashändelser som kan aktivera en utlösare inkluderar INSERT, UPDATE, DELETE, etc. Dessutom, när du skapar en utlösare för en tabell, kommer utlösaren att tas bort automatiskt när tabellen tas bort.

Hur Trigger används i PostgreSQL?

En trigger kan markeras med operatorn FOR EACH ROW under skapandet. En sådan trigger anropas en gång för varje rad som ändras av operationen. En trigger kan också markeras med operatorn FOR EACH STATEM under skapandet. Denna trigger exekveras endast en gång för en specifik operation.

PostgreSQL Skapa Trigger

För att skapa en trigger använder vi funktionen CREATE TRIGGER. Här är syntaxen för funktionen:

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

Triggernamnet är namnet på triggern.

FÖRE, EFTER och ISTÄLLET FÖR är nyckelord som bestämmer när utlösaren kommer att anropas.

Händelsenamnet är namnet på händelsen som gör att triggern anropas. Det här kan vara INFOGA, UPPDATERA, DELETE, etc.

Tabellnamnet är namnet på tabellen där utlösaren ska skapas.

Om triggern ska skapas för en INSERT-operation måste vi lägga till parametern ON kolumnnamn.

Följande syntax visar detta:

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

PostgreSQL Skapa triggerexempel

Vi kommer att använda pristabellen nedan:

Pris:

PostgreSQL Skapa Trigger

Låt oss skapa en annan tabell, Price_Audits, där vi kommer att logga ändringarna som gjorts i pristabellen:

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

Vi kan nu definiera en ny funktion som heter 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;

Ovanstående funktion kommer att infoga en post i tabellen Price_Audits inklusive det nya rad-id:t och tiden då posten skapas.

Nu när vi har triggerfunktionen ska vi binda den till vår Price-tabell. Vi ger triggern namnet price_trigger. Innan en ny post skapas kommer triggerfunktionen att anropas automatiskt för att logga ändringarna. Här är triggern:

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

Låt oss infoga en ny post i pristabellen:

INSERT INTO Price
VALUES (3, 400);

Nu när vi har infogat en post i Price-tabellen, bör en post också infogas i Price_Audits-tabellen på grund av den trigger vi skapade. Låt oss kontrollera detta:

SELECT * FROM Price_Audits;

Detta kommer att returnera följande:

PostgreSQL Skapa Trigger

Utlösaren fungerade framgångsrikt.

PostgreSQL Listutlösare

Alla triggers som du skapar i PostgreSQL lagras i tabellen pg_trigger. För att se listan över triggers som du har på databas, fråga tabellen genom att köra kommandot SELECT enligt nedan:

SELECT tgname FROM pg_trigger;

Detta returnerar följande:

PostgreSQL Listutlösare

Kolumnen tgname i tabellen pg_trigger anger namnet på utlösaren.

PostgreSQL Släpp avtryckaren

När en avtryckare inte längre behövs kan du ta bort den lika enkelt. För att släppa en PostgreSQL trigger använder vi DROP TRIGGER-satsen med följande syntax:

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

Parametern trigger-name anger namnet på triggern som ska raderas.

Tabellnamnet anger namnet på tabellen från vilken triggern ska tas bort.

IF EXISTS-satsen försöker ta bort en trigger som finns. Om du försöker ta bort en utlösare som inte finns utan att använda IF EXISTS-satsen får du ett felmeddelande.

Alternativet CASCADE hjälper dig att automatiskt släppa alla objekt som är beroende av triggern.

Om du använder alternativet BEGRÄNSA kommer triggern inte att tas bort om objekt är beroende av det.

Till exempel:

För att släppa triggern som heter exempel_trigger på tabellen Företag, kör följande kommando:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

Använder pgAdmin

Låt oss nu se hur alla tre åtgärderna utförs med pgAdmin.

Hur man skapar trigger i PostgreSQL med pgAdmin

Så här skapar du en trigger i PostgreSQL använder pgAdmin:

Steg 1) Logga in på ditt pgAdmin-konto

Öppna pgAdmin och logga in på ditt konto med dina inloggningsuppgifter.

Steg 2) Skapa en demodatabas

  1. Klicka på Databaser i navigeringsfältet till vänster.
  2. Klicka på Demo.

Skapa trigger i PostgreSQL med pgAdmin

Steg 3) Skriv frågan

För att skapa tabellen Price_Audits, skriv frågan i redigeraren:

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

Steg 4) Kör frågan

Klicka på knappen Kör.

Skapa trigger i PostgreSQL med pgAdmin

Steg 5) Kör Code för revisionsfunktion

Kör följande kod för att definiera funktionen 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

Steg 6) Kör Code att skapa utlösare

Kör följande kod för att skapa triggern price_trigger:

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

Steg 7) Infoga en ny post

  1. Kör följande kommando för att infoga en ny post i pristabellen:
INSERT INTO Price
VALUES (3, 400)
  1. Kör följande kommando för att kontrollera om en post har infogats i tabellen Price_Audits:
SELECT * FROM Price_Audits

Detta bör returnera följande:

Skapa trigger i PostgreSQL med pgAdmin

Steg 8) Kontrollera tabellens innehåll

Låt oss kontrollera innehållet i tabellen Price_Audits.

Listningsutlösare med pgAdmin

Steg 1) Kör följande kommando för att kontrollera utlösare i din databas:

SELECT tgname FROM pg_trigger

Detta returnerar följande:

Listningsutlösare med pgAdmin

Dropping Utlösare med pgAdmin

För att släppa triggern som heter exempel_trigger på tabellen Företag, kör följande kommando:

DROP TRIGGER example_trigger IF EXISTS
ON Company

Ladda ner den databas som används i denna handledning

Vanliga frågor

En FÖRE-trigger körs innan radändringen skrivs, så den kan ändra eller avvisa raden. En EFTER-trigger körs efter att ändringen har sparats, vilket passar för loggning och granskningsuppgifter.

En INSTEAD OF-utlösare definieras i en vy, inte i en tabell. Den ersätter INSERT, UPDATE eller DELETE med anpassad logik, vilket gör en skrivskyddad vy skrivbar.

Triggerfunktioner skrivs vanligtvis i PL/pgSQL. PostgreSQL stöder även PL/Python, PL/Perl, PL/Tcl och C, så att du kan välja det språk som passar din logik.

Använd ALTER TABLE table-name DISABLE TRIGGER trigger-name för att stänga av den och ENABLE TRIGGER för att slå på den igen. Detta undviker att den tappas bort.ping och återskapa avtryckaren under bulkbelastningar.

Ja. Varje trigger lägger till arbete till varje påverkad rad eller sats, så tung triggerlogik kan sakta ner skrivningar. Håll triggerfunktionerna korta och indexera alla kolumner de frågar efter.

Ja. Om en utlösare ändrar en annan tabell som också har utlösare, utlöses även dessa, vilket skapar kaskadliknande utlösare. PostgreSQL begränsar kapslingsdjupet för att förhindra oändliga loopar.

AI-kodningsassistenter omvandlar en förfrågan i enkelt språk till en komplett CREATE TRIGGER-sats och triggerfunktion, föreslår FÖRE- eller EFTER-timing och förklarar den genererade PL/pgSQL-koden för snabb granskning.

Ja. Verktyg som pgai och GPT-baserade assistenter översätter en beskriven regel till trigger-SQL och kan bygga INSERT-triggers som automatiskt taggar eller validerar nya data när de anländer.

Sammanfatta detta inlägg med: