Zum Inhalt springen

Trigger


Jaqueson

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...