Ergebnis 1 bis 8 von 8

Thema: Triggerproblem

  1. #1
    abenstex ist offline Neuer Benutzer
    Registriert seit
    27.06.2006
    Beiträge
    21

    Standard 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:
    Code:
    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:
    Code:
    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!

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Nutze mal nur _PID oder nur PID ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von abenstex Beitrag anzeigen
    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.
    http://ads.wars-nicht.de/blog/archiv...violation.html

    Diese Funktion wird von einem Trigger aufgerufen, allerdings erscheint x-mal folgender Output:
    Code:
    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 )"
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    abenstex ist offline Neuer Benutzer
    Registriert seit
    27.06.2006
    Beiträge
    21

    Standard

    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.

  5. #5
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von abenstex Beitrag anzeigen
    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.
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    abenstex ist offline Neuer Benutzer
    Registriert seit
    27.06.2006
    Beiträge
    21

    Standard

    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?

  7. #7
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Zitat Zitat von abenstex Beitrag anzeigen
    RAISE NOTICE ''PID %'', _pid ;
    Hast du mal _pid.pid probiert? Imho wird _pid ein Array und du musst ein spezifisches Feld daraus abrufen ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  8. #8
    abenstex ist offline Neuer Benutzer
    Registriert seit
    27.06.2006
    Beiträge
    21

    Standard

    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...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum