PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Assertions über Trigger simulieren


Klaus1980
22.06.2004, 12:23
Hi,

folgendes DB Schema ist gegeben:

Auto (Kennzeichen, Fabrikat, Modell, PS, Erstzulassung, km_Stand, Kosten_je_km)
Kunde (KDNR, Name, Adresse)
Mietvertrag (KDNR, Auto, von, bis, Preis, bezahlt?, km_gefahren)

Aufgabe:

Simulieren Sie die folgenden Assertions über Trigger.
a)Kein Leihwagen darf vor seiner Erstzulassung vermietet werden.

Lösungsansatz:

Create Trigger Erstzulassung_check
BEFORE INSERT on Mietvertrag
FOR EACH STATEMENT
WHEN new.auto.erstzulassung > new.von;
BEGIN
RAISE_APPLIKATION_ERROR (-20003,'Erstzulassung noch net da');
END;

Problem:

new.auto.erstzulassung geht halt nicht. Leider scheinbar nicht ganz so einfach wie in JAVA :). Allerdings kann ich jaauch net einfach in die WHEN Bedingung ein SELECT reinhauen. Das hätte ja eigentlich auch keinen Sinn.

Hat jemand einen Vorschlag ?

p.s. DB System ist Oracle 8

Gruss Klaus1980


Exceptionfault
19.08.2004, 23:57
Hi Klaus,


weiss nicht ob du dein Problem mittlerweile gelöst hast, aber ich würde das ganze komplett anders angehen: Nur mal ein Beispiel:


--
-- anlegen der Datentypen
--
CREATE OR REPLACE TYPE AUTO_T AUTHID CURRENT_USER AS OBJECT
( KENNZEICHEN VARCHAR2(20) NOT NULL,
FABRIKAT VARCHAR2(100) NOT NULL,
MODELL VARCHAR2(100) NOT NULL,
PS NUMBER(5,0) NOT NULL,
ERSTZULASSUNG DATE NOT NULL,
KM_STAND NUMBER(6,0) NOT NULL,
KOSTEN NUMBER(5,2) NOT NULL
);
/

CREATE OR REPLACE TYPE KUNDE_T AUTHID CURRENT_USER AS OBJECT
( KDNR NUMBER(10) NOT NULL,
NAME VARCHAR2(40) NOT NULL,
ADDRESS VARCHAR2(100) NOT NULL
);
/

CREATE OR REPLACE TYPE VERTRAG_T AUTHID CURRENT_USER AS OBJECT
( KUNDE REF KUNDE_T,
AUTO REF AUTO_T,
VON DATE NOT NULL,
BIS DATE NOT NULL,
PREIS NUMBER(10,2) NOT NULL,
PAYED NUMBER(1,0) NOT NULL,
KM NUMBER(6,0) NOT NULL
);
/

--
-- Datentabellen anlegen
-- ich verzichte hierbei auf PK und Indizes Spezifikation was man allerdings im Produktiveinsatz keineswegs machen sollte
--
CREATE TABLE AUTOS OF AUTO_T;
CREATE TABLE KUNDEN OF KUNDEN_T;
CREATE TABLE VERTRAEGE OF VERTRAG_T (
KUNDE WITH ROWID SCOPE IS KUNDEN,
AUTO WITH ROWID SCOPE IS AUTOS
);

--
-- dann lassen sich beliebige Constraints anlegen
--
ALTER TABLE VERTRAEGE
ADD CONSTRAINT CHK_ZULASSUNG CHECK (AUTO.ERSTZULASSUNG <= VON);


man verzeihe mir die deutschen spaltennamen etc... aber das macht dieses Beispiel hier einfacher ;)

mfg
Exceptionfault