Oracle - 在插入之前触发检查约束

时间:2012-11-13 16:51:58

标签: oracle plsql triggers

我想创建一个简单的触发器来检查表中存储的变量 如果变量的值为“1”,则批准插入
否则,如果变量的值为“2”,则提示错误消息。

CREATE OR REPLACE TRIGGER approval 
BEFORE INSERT ON VIP
REFERENCING OLD AS MEMBER
FOR EACH ROW
DECLARE 
  CONDITION_CHECK NUMBER;
BEGIN
  SELECT CONDITION INTO CONDITION_CHECK FROM MEMBER; 
  IF CONDITION_CHECK = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, ' UPGRADE DENIED!');
  END IF;
END;

但即使条件值为“1”,此触发器也会禁用所有条目。

3 个答案:

答案 0 :(得分:3)

您只需引用触发器中的:new.condition

即可
CREATE OR REPLACE TRIGGER approval 
  BEFORE INSERT ON VIP
  FOR EACH ROW
BEGIN
  IF :new.condition = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, ' UPGRADE DENIED!');
  END IF;
END;
但是,将这种逻辑置于触发器中是没有意义的。在列上定义CHECK约束更有意义,确保condition是允许的值集之一。

答案 1 :(得分:3)

使用AFTER触发器检查条件:其他BEFORE触发器可以修改这些值。在AFTER触发器中,您可以保证之后不会更改该值。

您的SELECT似乎错过了一个条件(如果我认为您试图从另一个表中获取价值):

CREATE OR REPLACE TRIGGER approval 
AFTER INSERT ON VIP
FOR EACH ROW
DECLARE 
  CONDITION_CHECK NUMBER;
BEGIN
  SELECT CONDITION 
    INTO CONDITION_CHECK 
    FROM MEMBER 
   WHERE member_id = :new.member_id; 
  IF CONDITION_CHECK = '2' THEN
    RAISE_APPLICATION_ERROR (-20000, 'UPGRADE DENIED!');
  END IF;
END;

答案 2 :(得分:0)

您正在引用旧数据而不是新数据 - 可能这不是您的意图?