涉及两个表SQL的触发器

时间:2016-03-27 18:49:24

标签: sql oracle

我有两张桌子:

合同(球员,球队)

比赛(球员,球队,比赛)

团队是从0到9的NUMBER(1)。

MATCHES中的属性团队必须与合同中的此玩家相同或少于或少于1。 (在比赛中,同一个玩家可能会出现不止一次)。

如果MATCHES中的所有玩家都符合我之前说过的条件,我必须用触发器检查

我试过了,但没找到:

  CREATE TRIGGER trigA
  BEFORE INSERT OR UPDATE OF team on matches
  FOR EACH ROW
  DECLARE error EXCEPTION;
  BEGIN
  IF (:NEW.team!=contracts.team OR :NEW.team!=contracts.team +1 OR :NEW.team!=contracts.team -1) AND (:NEW.player) = contracts.player
  THEN error;
  END IF;
  EXCEPTION
  WHEN error THEN DBMS_OUTPUT.PUT_LINE('Invalid Team');
  END;
/

2 个答案:

答案 0 :(得分:0)

在触发器中,您需要查询触发器中的CONTRACTS表,查找满足您所获得条件的CONTRACTS行。如果你发现至少一件事情都没问题。如果你不需要提出错误。

这样的事情:

CREATE TRIGGER MATCHES_BIU_TEAM
  BEFORE INSERT OR UPDATE OF team on matches
  FOR EACH ROW
DECLARE
  nContract_count  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nContract_count
    FROM CONTRACTS c
    WHERE c.PLAYER = :NEW.PLAYER AND
          c.TEAM BETWEEN :NEW.TEAM - 1
                     AND :NEW.TEAM + 1;

  IF nContract_count = 0 THEN
    RAISE_APPLICATION_ERROR(...);
  END IF;
END MATCHES_BIU_TEAM;

查看如何使用RAISE_APPLICATION_ERROR引发调用程序可以捕获的异常。这很重要,因为如果发生异常,你不想让它在触发器中的EXCEPTION处理程序中消失 - 需要引发它以便调用应用程序代码可以处理它

祝你好运。

答案 1 :(得分:0)

另一种方法是:

CREATE TRIGGER MATCHES_BIU_TEAM
  BEFORE INSERT OR UPDATE OF team on matches
  FOR EACH ROW
DECLARE
  matchTeam  NUMBER;
BEGIN
  SELECT c.team
    INTO matchTeam
    FROM CONTRACTS c
    WHERE c.player = :NEW.player;

  IF matchTeam < :NEW.team - 1 OR matchTeam > :NEW.team + 1 THEN
    RAISE_APPLICATION_ERROR(...);
  END IF;
END MATCHES_BIU_TEAM;

这假定a)您要将contracts.teammatches.team进行比较(Bob Jarvis&#39; answer将contracts中的记录数matches.team的值进行比较),b)每个玩家contracts中只有一条记录。