Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Trigger

Empfohlene Antworten

Veröffentlicht

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

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

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

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!

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.