From: | "Albe Laurenz" <all(at)adv(dot)magwien(dot)gv(dot)at> |
---|---|
To: | "Rolf Schaufelberger *EXTERN*" <rs(at)plusw(dot)de>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: cache lookup failed for function ... |
Date: | 2007-08-30 12:26:42 |
Message-ID: | D960CB61B694CF459DCFB4B0128514C222123E@exadv11.host.magwien.gv.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Rolf Schaufelberger schrieb:
> ich arbeite in meinem Projekt viel mit Trigger und Functions.
> Dabei werden z.T. Funktionen durch die Trigger
> aufgerufen (perform ...)
> Dabei stelle ich manchmal Probleme fest derart, dass
> falsche Berechnungen durchgeführt werden, da ein Trigger
> eine Funktion verwendet, die im Cache liegt! Wenn ich
> die Funktion nur neu lade (create or replace.. ) wird
> trotzdem die alte verwendet, wenn ich sie droppe und
> neu lade bekomme ich die Fehlermeldung aus dem Betreff.
> Meine Grundsätzliche Frage: Wo ist dieses verhalten
> (caching von Funktionen) dokumentiert und kann man das
> beeinflussen ? Wann / Wie wird der cache gelöscht ?
Wahrscheinlich verstehe ich das falsch, aber sowas kann's
eigentlich nicht geben. Siehe folgendes Beispiel:
CREATE TABLE test(id integer PRIMARY KEY);
CREATE OR REPLACE FUNCTION tr() RETURNS trigger
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
RAISE NOTICE 'Erste Version, aufgerufen mit %', NEW.id;
RETURN NULL;
END;$$;
CREATE TRIGGER test_i AFTER INSERT ON test FOR EACH ROW
EXECUTE PROCEDURE tr();
INSERT INTO test(id) VALUES (42);
NOTICE: Erste Version, aufgerufen mit 42
SELECT oid FROM pg_proc WHERE proname='tr';
oid
-------
45834
(1 row)
CREATE OR REPLACE FUNCTION tr() RETURNS trigger
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
RAISE NOTICE 'Zweite Version, aufgerufen mit %', NEW.id;
RETURN NULL;
END;$$;
INSERT INTO test(id) VALUES (-1);
NOTICE: Zweite Version, aufgerufen mit -1
SELECT oid FROM pg_proc WHERE proname='tr';
oid
-------
45834
(1 row)
Funktionen werden einfach ersetzt, und die OID ändert
sich nicht. Das heißt, auch ein Statement, das bereits
vor dem Ersetzen der Funktion ausgeführt wurde und nachher
wiederverwendet wird (in einer PL/pgSQL-Funktion z.B.),
wird die geänderte Funktion verwenden.
Im Ausführungsplan werden Objekte über OID referenziert.
Liebe Grüße,
Laurenz Albe
From | Date | Subject | |
---|---|---|---|
Next Message | Albe Laurenz | 2007-08-30 15:27:51 | Re: cache lookup failed for function ... |
Previous Message | Stefan Kaltenbrunner | 2007-08-30 12:16:42 | Re: cache lookup failed for function ... |