sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres-trigger efter infogning åtkomst till NEW

Från den fina manualen:

36.1. Översikt över triggerbeteende
[...]
För en utlösare på radnivå inkluderar indata även NEW rad för INSERT och UPDATE utlösare och/eller OLD rad för UPDATE och DELETE utlösare. Utlösare på uttalandenivå har för närvarande inget sätt att undersöka de individuella raderna som ändrats av uttalandet.

Och från Trigger Procedures:

NEW
Datatyp RECORD; variabel som innehåller den nya databasraden för INSERT /UPDATE operationer i utlösare på radnivå. Denna variabel är NULL i utlösare på satsnivå och för DELETE operationer.

Notera vad det står om utlösare på radnivå och utlösare på uttalandenivå.

Du har en utlösare på uttalandenivå:

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

Utlösare på påståendenivå utlöses en gång per påstående och ett påstående kan tillämpas på flera rader så begreppet berörd rad (vilket är NEW och OLD är om) gäller helt enkelt inte.

Om du vill använda NEW (eller OLD ) i en utlösare vill du att utlösaren ska köras för varje påverkad rad och det betyder att du vill ha en utlösare på radnivå:

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

Jag ändrade precis FOR EACH STATEMENT till FOR EACH ROW .

Din trigger bör också returnera något:

En triggerfunktion måste returnera antingen NULL eller ett post-/radvärde som har exakt strukturen för tabellen som utlösaren aktiverades för.
[...]
Returvärdet för en utlösare på radnivå som aktiverades AFTER eller en utlösare på statement-nivå aktiverad BEFORE eller AFTER ignoreras alltid; det kan lika gärna vara null. Men någon av dessa typer av utlösare kan fortfarande avbryta hela operationen genom att visa ett fel.

Så du bör RETURN NEW; eller RETURN NULL; i din trigger. Du har en AFTER-utlösare så det spelar ingen roll vilken RETURN du använder men jag skulle gå med RETURN NEW; .




  1. Olika sätt att övervaka SQL Server AlwaysOn-tillgänglighetsgrupper

  2. Visa nästa evenemangsdatum

  3. Oracles datumjämförelse har gått sönder på grund av sommartid

  4. Är det möjligt att framtvinga datakontroll i MySQL med hjälp av reguljära uttryck