Hallo,
ich habe eine Triggerfunktion gebastelt, die bei einem Insert in Tabelle1 anschließend Werte in eine zweite Tabelle2 schreibt.
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: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();
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:
Sollte faktisch das sein, was Du das tust. Vermutlich hast Du uns einen Teil der Wahrheit unterschlagen.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)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen