【问题标题】:Using a trigger to implement a foreign key check constraint使用触发器实现外键检查约束
【发布时间】:2014-03-03 10:08:48
【问题描述】:

我正在尝试将此约束实现到我的数据库中: (在表种族) 约束(日期

基本上 Race 表中的列需要小于 Meeting 表中的 EndDate 列。

很确定我需要使用触发器来实现外键,但是我不确定我将如何实现一个。到目前为止,我所拥有的是:

CREATE OR REPLACE TRIGGER RaceDateCheck
AFTER UPDATE OF Race ON StartDateCheck
BEGIN
 INSERT INTO Race
    (MeetingEndDate)
 SELECT EndDate FROM Meeting
END;

谢谢,

【问题讨论】:

  • 嗯,刚刚意识到这听起来很熟悉......有点像this。有趣的是,两者都试图插入触发器;有人告诉你这样做吗?
  • 看起来那个人和我在同一门课上。是的,我们被明确告知要使用触发器,而不仅仅是向我们提供的表中添加额外的列。
  • 是的,但是你们俩在触发器中都有一个insert,这是无效的;只是想知道您是否被(错误地)教过这样做。
  • 别这么认为,这是我在谷歌上搜索答案和试图破译讲义的混合体,主要是反复试验。

标签: oracle plsql triggers foreign-keys


【解决方案1】:

大概比赛日期必须在会议开始日期和结束日期之间,因此您可以同时检查两者;并且大概你想检查这个是否有新记录,而不仅仅是更新。所以你可以使用类似的东西:

CREATE OR REPLACE TRIGGER RaceDateCheck
BEFORE INSERT OR UPDATE ON Race
FOR EACH ROW
DECLARE
  meetingStart Meeting.MeetingStartDate%TYPE;
  meetingEnd Meeting.MeetingEndDate%TYPE;
BEGIN
  SELECT StartDate, EndDate
  INTO meetingStart, meetingEnd
  FROM Meeting
  WHERE MeetingID = :NEW.MeetingID;

  IF :NEW.RaceDate < meetingStart
    OR :NEW.RaceDate > meetingEnd THEN
      RAISE_APPLICATION_ERROR(-20001, 'Invalid race date');
  END IF;
END;

仅针对结束日期:

CREATE OR REPLACE TRIGGER RaceDateCheck
BEFORE INSERT OR UPDATE ON Race
FOR EACH ROW
DECLARE
  meetingEnd Meeting.MeetingEndDate%TYPE;
BEGIN
  SELECT EndDate
  INTO meetingEnd
  FROM Meeting
  WHERE MeetingID = :NEW.MeetingID;

  IF :NEW.RaceDate > meetingEnd THEN
    RAISE_APPLICATION_ERROR(-20001, 'Invalid race date');
  END IF;
END;

【讨论】:

  • 谢谢!但是,MeetingStart Date 已经出现在我正在使用的表格中;所以我已经让那个检查约束起作用了——如果我要删除所有对 MeetingStart 的引用;这一切都还有效吗?
  • @Naffel - 是的。不过,每场比赛的会议开始日期都重复是很奇怪的。
  • 对了,谢谢,等我的 VPN 再次工作后,我会测试一下。
  • 它似乎在抛出错误,我不确定这是我需要实现的。我将其与将约束应用于我创建的表的脚本(在另一个脚本中)一起放入。我需要能够添加这些约束并随意删除它们,而且似乎没有一种方法可以测试是否设置了永久性的东西。
  • 如果启用了触发器,那么插入或更新日期错误的行将引发异常,是的。但这与检查约束的作用没有太大区别?当然,您可以删除或禁用触发器。但是有很大的不同;创建或启用触发器将验证表中的现有数据;如果会议日期发生变化,那么比赛表中的日期将不会被重新验证。
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 2014-06-28
  • 2012-03-12
  • 2017-02-28
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多