sql >> Database >  >> RDS >> PostgreSQL

Postgres-trigger na invoegen toegang tot NIEUW

Uit de fijne handleiding:

36.1. Overzicht van triggergedrag
[...]
Voor een trigger op rijniveau bevatten de invoergegevens ook de NEW rij voor INSERT en UPDATE triggers, en/of de OLD rij voor UPDATE en DELETE triggers. Triggers op instructieniveau hebben momenteel geen manier om de individuele rij(en) te onderzoeken die door de instructie zijn gewijzigd.

En van triggerprocedures:

NEW
Gegevenstype RECORD; variabele met de nieuwe databaserij voor INSERT /UPDATE bewerkingen in triggers op rijniveau. Deze variabele is NULL in triggers op instructieniveau en voor DELETE operaties.

Let op wat er staat over triggers op rijniveau en triggers op instructieniveau.

Je hebt een trigger op statement-niveau:

...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

Triggers op instructieniveau worden één keer per instructie geactiveerd en een instructie kan van toepassing zijn op meerdere rijen, dus het begrip betrokken rij (dat is wat NEW en OLD zijn over) is gewoon niet van toepassing.

Als u NEW . wilt gebruiken (of OLD ) in een trigger, dan wilt u dat de trigger wordt uitgevoerd voor elke betrokken rij en dat betekent dat u een trigger op rijniveau wilt:

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();

Ik heb zojuist FOR EACH STATEMENT changed gewijzigd naar FOR EACH ROW .

Je trigger zou ook iets moeten retourneren:

Een triggerfunctie moet ofwel NULL . teruggeven of een record-/rijwaarde met exact de structuur van de tabel waarvoor de trigger is geactiveerd.
[...]
De retourwaarde van een trigger op rijniveau die AFTER is geactiveerd of een trigger op instructieniveau is BEFORE of AFTER wordt altijd genegeerd; het kan net zo goed nul zijn. Elk van deze typen triggers kan echter nog steeds de hele bewerking afbreken door een fout te veroorzaken.

Dus je moet RETURN NEW; of RETURN NULL; in je trekker. Je hebt een AFTER-trigger, dus het maakt niet uit welke RETURN je gebruikt, maar ik zou kiezen voor RETURN NEW; .




  1. 2 manieren om een ​​nieuwe regel in een string in SQLite in te voegen

  2. probleem met Oracle-parameters in SELECT IN

  3. Een eenvoudige use-case voor indexen op primaire sleutels

  4. PgBouncer Connection Pooler voor PostgreSQL gebruiken met ClusterControl 1.8.2