sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres-udløser efter indstik med adgang til NYT

Fra den fine manual:

36.1. Oversigt over Trigger Behavior
[...]
For en trigger på rækkeniveau inkluderer inputdata også NEW række for INSERT og UPDATE triggere og/eller OLD række for UPDATE og DELETE udløser. Udløsere på erklæringsniveau har i øjeblikket ingen mulighed for at undersøge den eller de individuelle rækker, der er ændret af erklæringen.

Og fra Trigger Procedures:

NEW
Datatype RECORD; variabel, der indeholder den nye databaserække for INSERT /UPDATE operationer i udløsere på rækkeniveau. Denne variabel er NULL i udløsere på statement-niveau og for DELETE operationer.

Bemærk, hvad der står om udløsere på rækkeniveau og udløsere på udsagnsniveau.

Du har en trigger på erklæringsniveau:

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

Udløsere på erklæringsniveau udløses én gang pr. erklæring, og en erklæring kan gælde for flere rækker, så begrebet berørt række (hvilket er det NEW og OLD er omkring) gælder simpelthen ikke.

Hvis du vil bruge NEW (eller OLD ) i en trigger, så ønsker du, at triggeren skal udføres for hver berørt række, og det betyder, at du vil have en trigger på rækkeniveau:

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

Jeg har lige ændret FOR EACH STATEMENT til FOR EACH ROW .

Din trigger burde også returnere noget:

En triggerfunktion skal returnere enten NULL eller en post-/rækkeværdi, der har nøjagtig strukturen af ​​den tabel, triggeren blev udløst for.
[...]
Returværdien for en trigger på rækkeniveau udløst AFTER eller en udløser på statement-niveau udløst BEFORE eller AFTER ignoreres altid; den kan lige så godt være nul. Enhver af disse typer triggere kan dog stadig afbryde hele operationen ved at rejse en fejl.

Så du bør RETURN NEW; eller RETURN NULL; i din trigger. Du har en AFTER-trigger, så det er ligegyldigt, hvilken RETURN du bruger, men jeg ville gå med RETURN NEW; .




  1. 3 måder at returnere antallet af rækker i hver partition i SQL Server (T-SQL)

  2. Bedømmelse af din Database Performance Monitoring Setup

  3. ORA-00907:manglende højre parentes

  4. CRUD-drift med ASP.NET Core MVC, Entity Framework Core og SQL Server