在CHECK中选择?有触发器吗?

时间:2016-12-11 15:34:05

标签: oracle select triggers

我很难掌握触发概念,或者很清楚,在我的情况下使用它的方式。

到目前为止,这是我的创作:

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

哪个很酷,但不幸的是,我是一个新手,我不知道触发器如何帮助我......

任何?

1 个答案:

答案 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;