Oracle 10触发逻辑

时间:2013-12-07 11:50:59

标签: sql oracle date triggers

我正在创建一个电影数据库,您可以在其中插入电影(身份证,导演,出版年份...),导演,演员(身份证,出生日期,死亡日期日期)。我有一个触发器问题,因为在表格中我想确保演员,当你想要添加一个新演员时,他的出生年份不能大于电影出版年份。但随着我写的触发器,我无法插入任何新的演员,因为出生日期无法与电影出版年相比,因为电影尚不存在。而且我也不能添加任何新电影,因为我对导演也有相同的触发器 - 这也不起作用,而且这部电影还有一个外国强制性的key-id导演。这有点复杂,所以我希望你能得到我的意思

create or replace 
trigger "XVIKD00"."DATUM_NARODENIA_HEREC" 
  BEFORE INSERT OR UPDATE 
  ON HERCI
  FOR EACH ROW 
DECLARE 
  l_ROK_VYDANIA filmy.ROK_VYD%TYPE;
BEGIN 
  SELECT FILMY.ROK_VYD
    INTO l_ROK_VYDANIA 
    FROM FILMY
   WHERE FILMY.ID_FILM = :new.ID_HEREC;

  IF( (:new.dat_umr_her is not null)  and( FILMY.ROK_VYD is not null)
  extract( year from :new.dat_nar_her ) > l_ROK_VYDANIA ) 
  THEN
    RAISE_APPLICATION_ERROR(-2009,'Dátumy nie su v správnom časovom 
slede'); 
  END IF;
END;

1 个答案:

答案 0 :(得分:0)

您的表之间存在循环依赖关系,这样您就无法插入任何记录,因为其他记录尚不存在。

要以合理的方式处理这个问题,你应该:

Movies
id
name
Publishing_Year

Director
id
name
birthDate

Actor
id
name
birthDate

这样,您始终可以创建其中的每一个,而不会与其他人有任何依赖关系。

然后当你想说一些导演指导一部电影时,你会插入这样的表:

movie_director
id
movie_id
director_id

如果你想说某个演员在电影中盯着你在这样的表格中插入一条记录:

movie_actor
id
movie_id
actor_id

如果你想验证导演或演员的年龄是否足以进入所述电影,你可以在这两个表中放置验证该触发器的触发器。