Debuggen von PostgreSQL-Trigger
Habe ich diese Trigger in Postgresql, das kann ich nicht nur an die Arbeit (die nichts tut). Zum Verständnis, es ist, wie ich es definiert:
CREATE TABLE documents (
...
modification_time timestamp with time zone DEFAULT now()
);
CREATE FUNCTION documents_update_mod_time() RETURNS trigger
AS $$
begin
new.modification_time := now();
return new;
end
$$
LANGUAGE plpgsql;
CREATE TRIGGER documents_modification_time
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW
EXECUTE PROCEDURE documents_update_mod_time();
Nun, um es ein bisschen interessanter.. Wie prüfst du Trigger?
Kommentar zu dem Problem
Dies ist nicht unbedingt im Zusammenhang, aber vielleicht finden Sie es nützlich, die in Ihrem pgsql Abenteuer sowieso: stackoverflow.com/questions/430123/...
InformationsquelleAutor der Frage Dave Vogt | 2008-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie den folgenden code in eine Funktion auslösen, dann sehen die 'Nachrichten' - tab in pgAdmin3 oder die Ausgabe in psql:
Um zu sehen, was löst tatsächlich aufgerufen, wie oft usw, die folgende Anweisung ist der Lebensretter der Wahl:
Beachten Sie, dass, wenn der Auslöser nicht immer genannt, und Sie die Vererbung verwenden, kann es sein, dass Sie bisher nur definiert einen trigger auf die übergeordnete Tabelle, in der Erwägung, dass Trigger werden nicht vererbt von den child-Tabellen automatisch.
Schritt durch die Funktion verwenden, können Sie den debugger integriert pgAdmin3, die auf Windows ist standardmäßig aktiviert; alle Sie tun müssen ist, führen Sie den code, der sich in ...\8.3\share\contrib\pldbgapi.sql gegen die Datenbank, die Sie Debuggen, starten Sie pgAdmin3 mit der rechten Maustaste auf Ihre trigger-Funktion, klicken Sie auf "Set Breakpoint', und führen Sie dann eine Anweisung, die bewirkt, dass der trigger ausgelöst wird, wie die UPDATE-Anweisung über.
InformationsquelleAutor der Antwort Kev
Können Sie 'raise notice' - Anweisungen im Auslöser-Funktion zum Debuggen. Zum Debuggen wird der trigger nicht aufgerufen wird, ist eine andere Geschichte.
Wenn Sie ein 'raise exception' in deinem trigger-Funktion, können Sie immer noch tun inserts/updates?
Auch, wenn Sie Ihre update-Prüfung erfolgt in der gleichen Transaktion, wie Sie Ihre insert-test, now() wird die gleiche sein (da es nur einmal berechnet pro Transaktion) und deshalb das update nicht scheinen, etwas zu tun. Wenn das der Fall ist, stellen Sie Sie in separaten Transaktionen, oder ob dies ein Gerät zu testen, und Sie können nicht tun, verwenden Sie clock_timestamp().
Habe ich ein Gerät testen, das hängt davon ab, einige Zeit gehen durch zwischen den Transaktionen, also am Anfang der unit-test habe ich so etwas wie:
Dann in den trigger, verwenden Sie "set modification_time = default".
Also normalerweise nicht tun, die extra Berechnung, aber bei einem unit test dies ermöglicht es mir zu tun, fügt mit pg_sleep in zwischen zu simulieren, die Zeit, die vergeht und tatsächlich haben, werden in den Daten widergespiegelt.
InformationsquelleAutor der Antwort Kev
Stellt sich heraus, ich war mit der Vererbung in den oben genannten problem und vergaß es zu erwähnen. Jetzt für alle, die vielleicht in diesem als gut, hier einige debugging-Tipps:
Verwenden Sie den folgenden code zu Debuggen, was ein trigger ist zu tun:
Um zu sehen, was löst tatsächlich aufgerufen, wie oft usw, die folgende Anweisung ist der Lebensretter der Wahl:
Dann gibt ' s die eine Sache, die ich vorher nicht kannte: Trigger nur ausgelöst, wenn die Aktualisierung der Tabelle exakt Sie definiert sind. Wenn Sie die Vererbung verwenden, MÜSSEN Sie diese definieren, auf die child-Tabellen, wie gut!
InformationsquelleAutor der Antwort Dave Vogt