Triggerproblem

Hallo zusammen,

ich habe eine Funktion, die überprüfen soll, ob ein Primärschlüssel schon existiert und nur falls nicht, soll sie die Daten in die Tabelle schreiben. Diese Funktion wird von einem Trigger aufgerufen, allerdings erscheint x-mal folgender Output:

NOTICE:  PID <NULL>
CONTEXT:  SQL statement "INSERT  INTO mytable(pid, hi_jahr) VALUES( $1 ,  $2 )"
PL/pgSQL function "check_year" line 7 at SQL statement
SQL statement "INSERT  INTO mytable(pid, year) VALUES( $1 ,  $2 )"

Die Funktion dazu:

CREATE OR REPLACE FUNCTION check_year() RETURNS TRIGGER AS '
DECLARE _pid integer;
BEGIN

SELECT INTO _pid pid FROM mytable where year=NEW.year AND pid=NEW.pid;
RAISE NOTICE ''PID %'', _pid ;
IF _pid IS NULL THEN
    INSERT INTO mytable(pid, year) VALUES(NEW.pid, NEW.year);
    RAISE NOTICE ''VALUES WILL BE ADDED'';
    RETURN NEW;
ELSE
    RETURN null;
END IF;

END;' LANGUAGE plpgsql VOLATILE;
create trigger test_trigger before insert or update on mytable for each row execute procedure check_year();

Kann mir irgendjemand entweder den Output verständlich machen oder mir den Fehler zeigen?

Danke!

Nutze mal nur _PID oder nur PID …

http://ads.wars-nicht.de/blog/archives/11-Avoid-Unique-Key-violation.html

Diese Funktion wird von einem Trigger aufgerufen, allerdings erscheint x-mal folgender Output:

NOTICE: PID
CONTEXT: SQL statement “INSERT INTO mytable(pid, hi_jahr) VALUES( $1 , $2 )”
PL/pgSQL function “check_year” line 7 at SQL statement
SQL statement “INSERT INTO mytable(pid, year) VALUES( $1 , $2 )”

>

Du hast ja in Deiner Funktion auch RAISE NOTICE drin, also sollte dies auch zuschlagen.

> Kann mir irgendjemand entweder den Output verständlich machen oder mir den Fehler zeigen?
>
> Danke!

Ich sehe keinen Fehler.
\
\
Andreas

Ich wollte das eigentlich mit Triggern lösen, da ich aus einer GUI-App heraus eine Query dynamisch erstelle und daher wollte ich soviel wie möglich auf DB-Seite regeln.
Ich versteh allerdings nicht, warum keine Werte eingetragen werden und die Meldung zig-Mal erscheint. Die Query läuft praktisch ohne Ende weiter.

Okay.

Ich versteh allerdings nicht, warum keine Werte eingetragen werden und die Meldung zig-Mal erscheint. Die Query läuft praktisch ohne Ende weiter.

Mmh. Vielleicht kommst Du besser, du zählst das Vorkommen von pid, und nur wenn es 0 ist, fügst Du das ein.


Andreas

Das Problem, dass ständig irgendwelche Ausgaben erscheinen, denke ich kommt davon, dass ja der Trigger für alle Insert-Operationen gilt und ich in der Funktion, die der Trigger aufruft ich einen INSERT machen will. Sprich es ist ne Endlosschleife, oder sehe ich das falsch? Kann man das irgendwie umgehen?

Hast du mal _pid.pid probiert? Imho wird _pid ein Array und du musst ein spezifisches Feld daraus abrufen …

Hat sich erledigt: Anstatt den INSERT explizit aufzurufen, habe ich einfach nur RETURN NEW aufgerufen. Manchmal sieht man den ganzen Wald vor lauter Bäumen nicht…