1

我想创建一个简单的触发器来检查表中存储的变量。
如果变量的值为'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”,此触发器也会禁用所有条目。

4

3 回答 3

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是一组允许的值之一会更有意义。

于 2012-11-13T16:58:10.580 回答
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;
于 2012-11-13T17:02:23.053 回答
0

您引用的是旧数据而不是新数据 - 大概这不是您想要的?

于 2012-11-13T16:55:38.870 回答