【问题标题】:Oracle - Trigger to check constraint before insertOracle - 在插入前触发检查约束
【发布时间】:2012-11-13 16:51:57
【问题描述】:

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

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    使用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】:

      您可以在触发器中简单地引用: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 是允许的一组值之一会更有意义。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 您的意思是作为答案吗?如果是这样,您可能想让它看起来……更像是一个答案。
        • 感谢您的建议。我相信这是一个答案,至少足以告诉他问题所在——我觉得我不需要牵手。
        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 2015-01-02
        • 2014-06-28
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多