我很难掌握触发概念,或者很清楚,在我的情况下使用它的方式。
到目前为止,这是我的创作:
CREATE TABLE Station
(
nomStation VARCHAR2(100),
capacite NUMBER(5) NOT NULL,
lieu VARCHAR2(100) NOT NULL,
region VARCHAR2(100),
tarif NUMBER(6,2) DEFAULT 0,
PRIMARY KEY (nomStation),
CONSTRAINT UC_lieu_region UNIQUE (lieu, region),
CONSTRAINT regionUnique CHECK ( region='Ocean Indien' OR
region='Antilles' OR
region='Europe' OR
region='Ameriques' OR
region='Extreme Orient')
);
CREATE TABLE Activite
(
nomStation VARCHAR2(100),
libelle VARCHAR2(100),
prix NUMBER(6,2) DEFAULT 0,
CONSTRAINT PK_nomStation_libelle PRIMARY KEY (nomStation, libelle),
CONSTRAINT FK_nomStation FOREIGN KEY (nomStation) REFERENCES Station(nomStation) ON DELETE CASCADE
);
我想要实现的是对Station.tarif和Activite.prix的限制。
Activite.prix < Station.tarif && Activite.prix > 0
很自然地我尝试了这个:
CONSTRAINT CH_prix CHECK (prix<(SELECT tarif FROM Station)),
但是我得到了子查询错误。现在我知道我遇到与此主题相同的问题:Using subquery in a Check statement in Oracle
哪个很酷,但不幸的是,我是一个新手,我不知道触发器如何帮助我......
任何?
答案 0 :(得分:1)
您可以像这样创建trigger。
Create or replace trigger tr_activite_prix
Before insert or update of prix on activite for each row
is
v_tarrif station.tarrif%type;
Begin
Select tarrif into v_tarrif
From station
Where nomstation = :new.nomstation;
If :new.prix >= v_tarrif then
raise_application_error(-20001,'Invalid prix');
End if;
End;