Ergebnis 1 bis 5 von 5

Thema: Trigger-Funktion verursacht doppelte Werte in Tabelle

  1. #1
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard Trigger-Funktion verursacht doppelte Werte in Tabelle

    Hallo,

    ich habe eine Triggerfunktion gebastelt, die bei einem Insert in Tabelle1 anschließend Werte in eine zweite Tabelle2 schreibt.

    Code:
    DROP TRIGGER insert_in_dcmseries on dcmseries;
    
    CREATE OR REPLACE FUNCTION add_seriesuid_to_calculatedseries() RETURNS TRIGGER AS 
    $calculatedseries$
    DECLARE
        
    BEGIN
        IF(TG_OP='INSERT') THEN
            INSERT INTO calculatedseries(seriesinstanceuid,studyinstanceuid) VALUES(NEW.seriesinstanceuid,NEW.studyinstanceuid);
        END IF;
        RETURN NEW;
    END;
    $calculatedseries$ LANGUAGE plpgsql;
    
    CREATE TRIGGER insert_in_dcmseries BEFORE INSERT ON dcmseries FOR EACH ROW EXECUTE PROCEDURE add_seriesuid_to_calculatedseries();
    Die Einträge werden in der zweiten Tabelle richtig gemacht. Allerdings wird in Tabelle1 nochmals zusätzlich zu dem eigentlichen INSERT die Werte der Tabelle2 angehängt. Ich weiß, etwas verwirrend und deshalb hier ein kleines Beispiel:

    INSERT INTO dcmseries(seriesinstanceuid, studyinstanceuid, col3, col4)
    VALUES (1, 2, 3, 4);

    Dann steht in Tabelle1:
    1, 2, 3, 4 (richtig)
    1, 2 (falsch!)

    und in Tabelle2
    1, 2 (richtig)

    Kann mir jemand bitte sagen, wie der doppelte Eintrag (also in Zeile 2) zustande kommt!? Eine Fehlermeldung bekomme ich nicht!

    Schon mal vielen Dank!!!
    Gruß
    Thomas

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    Hallo,

    ich habe eine Triggerfunktion gebastelt, die bei einem Insert in Tabelle1 anschließend Werte in eine zweite Tabelle2 schreibt.

    Code:
    DROP TRIGGER insert_in_dcmseries on dcmseries;
    
    CREATE OR REPLACE FUNCTION add_seriesuid_to_calculatedseries() RETURNS TRIGGER AS 
    $calculatedseries$
    DECLARE
        
    BEGIN
        IF(TG_OP='INSERT') THEN
            INSERT INTO calculatedseries(seriesinstanceuid,studyinstanceuid) VALUES(NEW.seriesinstanceuid,NEW.studyinstanceuid);
        END IF;
        RETURN NEW;
    END;
    $calculatedseries$ LANGUAGE plpgsql;
    
    CREATE TRIGGER insert_in_dcmseries BEFORE INSERT ON dcmseries FOR EACH ROW EXECUTE PROCEDURE add_seriesuid_to_calculatedseries();
    Die Einträge werden in der zweiten Tabelle richtig gemacht. Allerdings wird in Tabelle1 nochmals zusätzlich zu dem eigentlichen INSERT die Werte der Tabelle2 angehängt. Ich weiß, etwas verwirrend und deshalb hier ein kleines Beispiel:

    INSERT INTO dcmseries(seriesinstanceuid, studyinstanceuid, col3, col4)
    VALUES (1, 2, 3, 4);

    Dann steht in Tabelle1:
    1, 2, 3, 4 (richtig)
    1, 2 (falsch!)

    und in Tabelle2
    1, 2 (richtig)

    Kann mir jemand bitte sagen, wie der doppelte Eintrag (also in Zeile 2) zustande kommt!? Eine Fehlermeldung bekomme ich nicht!

    Schon mal vielen Dank!!!
    Gruß
    Thomas
    Kann ich nicht nachvollziehen:

    Code:
    test=# create table tab1(a int, b int, c int, d int);
    CREATE TABLE
    Zeit: 0,712 ms
    test=*# create table tab2(a int, b int);
    CREATE TABLE
    Zeit: 0,892 ms
    test=*# create function add_tab2() returns trigger as $$ begin IF(TG_OP='INSERT') THEN insert into tab2 values (new.a, new.b); end if; return new; end; $$languageplpgsql;
    CREATE FUNCTION
    Zeit: 74,257 ms
    test=*# create trigger trg_tab1 before insert on tab1 for each row execute procedure add_tab2();
    CREATE TRIGGER
    Zeit: 47,659 ms
    test=*# insert into tab1 values (1,2,3,4);
    INSERT 0 1
    Zeit: 26,246 ms
    test=*# select * from tab1;
     a | b | c | d
    ---+---+---+---
     1 | 2 | 3 | 4
    (1 Zeile)
    
    Zeit: 21,975 ms
    test=*# select * from tab2;
     a | b
    ---+---
     1 | 2
    (1 Zeile)
    Sollte faktisch das sein, was Du das tust. Vermutlich hast Du uns einen Teil der Wahrheit unterschlagen.

    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

  3. #3
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    Hallo Andreas,

    schon mal vielen Dank für deine Antwort! Ich hab das kleine Beispiel auch ausprobiert und tatsächlich, es funktioniert! Deine Vermutung, einen Teil der Wahrheit zu unterschlagen, könnte auch stimmen, nur mach ich das bestimmt nicht bewußt ...

    Die Tabellen an sich werden mit INSERTS über JDBC gefüllt. Aber an dem liegt nicht der Fehler, da bei manuell ausgeführten Querys das Phänomen auch auftritt. An vielleicht anderen Funktionen kann es auch nicht liegen, da diese momentan noch die Erste ist. Bleibt meiner Meinung nach nur noch die Indizes oder die Tabellenstruktur, wobei es eigentlich doch nicht an den Indizes legen kann, oder ... ??
    Kann ich in Postgres debuggen? Das würde mir jetzt so noch einfallen, um den Fehler zu finden?!? Oder wie bekomme ich den Fehler am besten raus? Würde es euch evtl. helfen, die "Creates" von den Tabellen zu listen?

    Ich versuche morgen mal die zwei betroffenen Tabellen isoliert mit der Triggerfunktion zu testen ... vielleicht hilfts ja ...

    Gruß
    Thomas

    Zitat Zitat von akretschmer Beitrag anzeigen
    Kann ich nicht nachvollziehen:

    Code:
    test=# create table tab1(a int, b int, c int, d int);
    CREATE TABLE
    Zeit: 0,712 ms
    test=*# create table tab2(a int, b int);
    CREATE TABLE
    Zeit: 0,892 ms
    test=*# create function add_tab2() returns trigger as $$ begin IF(TG_OP='INSERT') THEN insert into tab2 values (new.a, new.b); end if; return new; end; $$languageplpgsql;
    CREATE FUNCTION
    Zeit: 74,257 ms
    test=*# create trigger trg_tab1 before insert on tab1 for each row execute procedure add_tab2();
    CREATE TRIGGER
    Zeit: 47,659 ms
    test=*# insert into tab1 values (1,2,3,4);
    INSERT 0 1
    Zeit: 26,246 ms
    test=*# select * from tab1;
     a | b | c | d
    ---+---+---+---
     1 | 2 | 3 | 4
    (1 Zeile)
    
    Zeit: 21,975 ms
    test=*# select * from tab2;
     a | b
    ---+---
     1 | 2
    (1 Zeile)
    Sollte faktisch das sein, was Du das tust. Vermutlich hast Du uns einen Teil der Wahrheit unterschlagen.

    Andreas

  4. #4
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    Hallo,

    das ist jetzt richtig peinlich aber ich muss sagen, dass sich das erledigt hat! Ich habe zuvor mit "Inherits Tables" rumgespielt und daraus die Tabelle2 im Beispiel erstellt. War richtig unachtsam von mir und hat mir selbst viel Zeit gekostet. Was nun passiert, wenn ich in einer vererbten Tabelle nen Insert mache, brauch ich wohl nicht sagen ...

    Nochmals sorry wenn ich den Einen oder Anderen Kopfzerbrechen gemacht hab! Ich hoff, ich kann mich hier nochmals bei einem Problem blicken lassen ... ?

    Gruß
    Thomas

    Zitat Zitat von elephant Beitrag anzeigen
    Hallo Andreas,

    schon mal vielen Dank für deine Antwort! Ich hab das kleine Beispiel auch ausprobiert und tatsächlich, es funktioniert! Deine Vermutung, einen Teil der Wahrheit zu unterschlagen, könnte auch stimmen, nur mach ich das bestimmt nicht bewußt ...

    Die Tabellen an sich werden mit INSERTS über JDBC gefüllt. Aber an dem liegt nicht der Fehler, da bei manuell ausgeführten Querys das Phänomen auch auftritt. An vielleicht anderen Funktionen kann es auch nicht liegen, da diese momentan noch die Erste ist. Bleibt meiner Meinung nach nur noch die Indizes oder die Tabellenstruktur, wobei es eigentlich doch nicht an den Indizes legen kann, oder ... ??
    Kann ich in Postgres debuggen? Das würde mir jetzt so noch einfallen, um den Fehler zu finden?!? Oder wie bekomme ich den Fehler am besten raus? Würde es euch evtl. helfen, die "Creates" von den Tabellen zu listen?

    Ich versuche morgen mal die zwei betroffenen Tabellen isoliert mit der Triggerfunktion zu testen ... vielleicht hilfts ja ...

    Gruß
    Thomas

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    Nochmals sorry wenn ich den Einen oder Anderen Kopfzerbrechen gemacht hab! Ich hoff, ich kann mich hier nochmals bei einem Problem blicken lassen ... ?

    Gruß
    Thomas
    Ja, aber laß das TOFU weg.

    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

Stichworte

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