it-swarm.com.de

Was ist der Unterschied zwischen einem After-Update und einem Before-Update in PostgreSQL?

Was ist der Unterschied zwischen einem After-Update und einem Before-Update in PostgreSQL? Ich konnte den Unterschied zwischen after update und before update weil es so aussieht, als ob die Funktion immer vor dem Update ausgeführt wurde.

Also habe ich folgendes Beispiel gemacht:

Ich habe eine Funktion erstellt, die eine Tabelle aktualisiert, wenn der Status typing lautet, jedoch mit einer Verzögerung von 10 Sekunden.

CREATE OR REPLACE FUNCTION fai_prueba()
  RETURNS trigger AS
$BODY$
begin
    if new.status = 'Typing' then
        update image set status = 'ToTyping', path = 'Real path' from pg_sleep(5) where id = old.id;
    end if;
    return null;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fai_prueba()
  OWNER TO postgres;

dann habe ich folgenden auslöser

create trigger tai 
after update on image 
for each row execute procedure fai_prueba();

wenn ich jedoch ein UPDATE ausführe, wird die Abfrage erst beendet, wenn die Verzögerung endet

UPDATE image 
    SET  path='fake path'
       , status= 'Typing' 
WHERE id=5;

>Query returned successfully: 0 rows affected, 10042 ms execution time.

Ist es also möglich, dass die Aktualisierungsabfrage vor dem Auslöser endet?

8
oriaj

Es gibt einen Hauptunterschied in einem Trigger, der NACH einem ist, der VORHER ist, aber beide werden unabhängig davon ausgeführt.

In einem BEFORE-Trigger wird der Trigger ausgeführt, BEVOR die DML-Anweisung ausgeführt wird. Sie haben also die Möglichkeit, die Zeile NEW (alt: OLD im Fall von DELETE) BEFORE zu ändern eingefügt/aktualisiert/gelöscht ... Aber alles, was Sie tun möchten, können Sie tun (z. B. Daten in einer separaten Tabelle überprüfen und ein Update/Einfügen/was auch immer in dieser Tabelle usw. ausgeben). Wenn der Trigger aus irgendeinem Grund eine AUSNAHME verursacht, wird die Ausführung beendet und die DML-Anweisung wird nie ausgeführt.

In einem AFTER-Trigger wird der Trigger ausgeführt, nachdem die DML-Anweisung ausgeführt wurde. Sie haben bereits die Möglichkeit verloren, die Datensätze: NEW und: OLD zu ändern, und haben tatsächlich eine Bedeutung. Sie können jedoch weiterhin im Trigger tun, was Sie wollen. Wenn der Trigger für PostgreSQL eine Ausnahme verursacht, führt dies zu einem Rollback der ursprünglichen DML. Ich glaube nicht, dass dies für alle RDBMS gilt - aber es fällt mir derzeit schwer, ein Beispiel zu finden.

Eine häufige Verwendung eines BEFORE-Triggers besteht darin, eine Zeitstempelspalte auf "now" zu setzen, bevor die Daten eingefügt wurden.

Eine häufige Verwendung eines AFTER-Triggers besteht darin, eine Prüf-/Verlaufstabelle mit den Änderungen zu füllen.

In beiden Fällen möchten Sie normalerweise ein ROLLBACK ausgeben, wenn Sie feststellen, dass eine Ausnahme ausgelöst wurde.

8
Joishi Bodio