【问题标题】:Assistance To Create a Trigger协助创建触发器
【发布时间】:2012-02-29 23:51:21
【问题描述】:

大家好,我需要在 ORACLE 10g 中创建一个触发器,以确保无法输入在birthDate 之前的 deathDate。我真的在这方面苦苦挣扎,请你提供支持,谢谢你好心的人。

我的方案是:

Actor (actorID, lastName, firstName, middleName, suffix, gender, birthDate, deathDate)
Movie (movieID, title, year, company, totalNoms, awardsWon, DVDPrice, discountPrice)
Quote (quoteID, quote)
Role (roleID ,roleName ,gender ,actorID* ,movieID*) 
RoleQuote (roleID*, quoteID*)

谢谢

如果您需要更多信息,请询问

我的关系约束是:

CONSTRAINT_NAME                C                                                
------------------------------ -                                                
QUOTE_FK                       R                                                
ROLE_FK                        R                                                
MOVIE_ROLE_FK                  R                                                
ACTOR_ROLE_FK                  R                                                
ACTORID                        P                                                
MOVIEID                        P                                                
QUOTEID                        P                                                
ROLEID                         P                                                
ROLEQUOTEID                    P       

Relationships:

ALTER TABLE Role ADD CONSTRAINT ACTOR_ROLE_FK FOREIGN KEY (actorID) REFERENCES Actor (actorID);
ALTER TABLE Role ADD CONSTRAINT MOVIE_ROLE_FK FOREIGN KEY (movieID) REFERENCES Movie (movieID);
ALTER TABLE RoleQuote ADD CONSTRAINT Role_FK FOREIGN KEY (roleID) REFERENCES Role (roleID);
ALTER TABLE RoleQuote ADD CONSTRAINT Quote_FK FOREIGN KEY (quoteID) REFERENCES Quote (quoteID);

【问题讨论】:

  • 到目前为止你尝试过什么? P.S...
  • 我将发布:CREATE TRIGGER death_date_not_valid BEFOREbirthDate
  • 我不知道这是否正确,但这是我尝试过的

标签: sql oracle triggers oracle10g


【解决方案1】:

这种约束应该作为CHECK 约束来实现

ALTER TABLE actor
  ADD CONSTRAINT chk_birth_before_death CHECK( birthDate < deathDate );

如果您确实需要通过触发器强制执行约束(这会更慢并且需要更多工作)

CREATE OR REPLACE TRIGGER check_death_date
  AFTER INSERT OR UPDATE ON actor
  FOR EACH ROW
BEGIN
  IF( :new.birthDate > :new.deathDate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Birth date cannot be later than death date.' );
  END IF;
END;

【讨论】:

  • 非常感谢,我会试试这个,让你知道上帝保佑你
  • 我需要添加alter表吗?或者我可以运行触发器吗?谢谢
  • @user1137472 - 您可以创建约束,也可以创建触发器。两者都做是没有意义的。我的强烈偏好是使用约束而不是使用触发器来强制执行此规则。
  • @user1337472,我能问一下您为什么选择实施触发器,当强烈建议(我同意该建议)时,这应该通过检查约束来实施?
  • 我正在学习 ORACLE 作为一种爱好,之前从未做过 oracle,因此我想尝试测试触发器,这仅供自己使用,因为我只是想学习不同的方法并自学触发就是全部
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2011-02-28
  • 2017-11-30
  • 2021-08-04
相关资源
最近更新 更多