Jaqueson Geschrieben 25. Oktober 2006 Teilen Geschrieben 25. Oktober 2006 Hi, ich habe auf einem Oracle10g Server 2 Tabellen: Ein mal Country: CREATE TABLE "COUNTRY" ( "NAME" VARCHAR2(32 BYTE) NOT NULL ENABLE, "CODE" VARCHAR2(4 BYTE), "CAPITAL" VARCHAR2(35 BYTE), "PROVINCE" VARCHAR2(32 BYTE), "AREA" NUMBER, "POPULATION" NUMBER ) ; und City: CREATE TABLE "CITY" ( "NAME" VARCHAR2(35 BYTE), "COUNTRY" VARCHAR2(4 BYTE), "PROVINCE" VARCHAR2(32 BYTE), "POPULATION" NUMBER, "LONGITUDE" NUMBER, "LATITUDE" NUMBER ) ; Ich möchte nun, dass automatisch immer dann wenn sich die Population in einer Stadt ändert, sich automatisch die Population des jewiligen Landes anpasst. CREATE TRIGGER upd_country AFTER INSERT OR UPDATE OR DELETE ON city BEGIN UPDATE country x SET x.population = (SELECT SUM(c.population) FROM city c WHERE c.country = x.code GROUP BY c.country) END; Allerdings funktioniert das nicht, es kommt immer beim updaten auf City zu einer Fehlermeldung... Woran kann das liegen? Danke und Gruß Jaqueson Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 25. Oktober 2006 Teilen Geschrieben 25. Oktober 2006 ich habe auf einem Oracle10g Server 2 Tabellen dass es sich bei deinem DBMS um oracle handelt, kann ich an den datentypen und deren präzisionsangaben erkennen, allerdings .... Allerdings funktioniert das nicht, es kommt immer beim updaten auf City zu einer Fehlermeldung... die welche wäre? poste mal die genaue ORA-xxxxx, UPDATE country x SET x.population = (SELECT SUM(c.population) FROM city c WHERE c.country = x.code GROUP BY c.country) ich vermute mal, dass das DBMS nicht weiss, welcher tabelle der tabellenalias "x" entspricht. versuch mal: UPDATE country x SET x.population = (SELECT SUM(c.population) FROM city c, country x WHERE c.country = x.code GROUP BY c.country) ist allerdings ungetestet, da ich hier keinen oracle client laufen habe. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 25. Oktober 2006 Teilen Geschrieben 25. Oktober 2006 Allerdings funktioniert das nicht, es kommt immer beim updaten auf City zu einer Fehlermeldung... ...und die lautet wie? das GROUP BY ist falsch/überflüssig. das SELECT liefert sowieso nur einen einzelnen wert zurück, sonst wird das schwierig mit der zuweisung. andererseits würde ich mir nochmal ganz genau überlegen, ob ich wirkich für jedes DML-statement auf CITY _ALLE_ werte in country aktualisieren will. man kann das auch so lösen (ungetestet): CREATE or replace TRIGGER ins_country AFTER INSERT ON city for each row BEGIN UPDATE country SET population = population + :new.population where code = :new.country; END; CREATE or replace TRIGGER upd_country AFTER UPDATE of population ON city for each row BEGIN UPDATE country SET population = population + (:new.population - :old.population) where code = :old.country; END; CREATE or replace TRIGGER del_country before DELETE ON city for each row BEGIN UPDATE country SET population = population - :old.population where code = :old.country; END; und du solltest _zwingend_ die relation zwischen CITY und COUNTRY definieren. dein schöner plan funktioniert nämlich überhaupt nicht, wenn für eine einfügte stadt noch gar kein land existiert. und country.population und city.population darf nicht NULL sein und sollte per default auf 0 stehen (ansonsten muss auf NULL in den triggern getestet werden)! ausserdem darf keiner auf die idee kommen, eine stadt mal kurz in ein anderes land zu verfrachten. das lässt sich aber einfach mit einem zweiten update im UPDATE-trigger lösen. -j Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaqueson Geschrieben 26. Oktober 2006 Autor Teilen Geschrieben 26. Oktober 2006 Ok, hier erst mal die Fehlermeldung meines Triggers: ORA-04098: Trigger 'upd_country' ist ungültig und konnte nicht neu bestätigt werden. Vendor code 4098 Wenn ich die Trigger von Jasper nehme, dann bringt er mir keine Fehlermeldung, allerdings macht er auch keine "Berechnungen"... Hab jetzt raus gefunden, dass ich mit: show errors trigger upd_country; die Fehler des Trigger anzeigen lassen kann. Dann kommt folgende Meldung: ORA-9000: Ungültige SQL-Anweisung Wenn ich die SQL-Anweisung UPDATE country x SET x.population = (SELECT SUM(c.population) FROM city c WHERE c.country = x.code GROUP BY c.country) Habe einen ; vergessen... UPDATE country x SET x.population = (SELECT SUM(c.population) FROM city c WHERE c.country = x.code GROUP BY c.country)[COLOR="Red"];[/COLOR] Jetzt geht es... Danke! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaqueson Geschrieben 26. Oktober 2006 Autor Teilen Geschrieben 26. Oktober 2006 Sorry, hab einen Fehler gemacht. Der Trigger von Jasper geht auch. Allerdings zählt er jedes mal das doppelte dazu (hab es bisher nur mit steigender Einwohnerzahl getestet)... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.