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

Posted

技术标签:

【中文标题】Oracle - 在插入前触发检查约束【英文标题】:Oracle - Trigger to check constraint before insert 【发布时间】: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”,此触发器也会禁用所有条目。

【问题讨论】:

【参考方案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】:

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

【讨论】:

您的意思是作为答案吗?如果是这样,您可能想让它看起来……更像是一个答案。 感谢您的建议。我相信这是一个答案,至少足以告诉他问题所在——我觉得我不需要牵手。

以上是关于Oracle - 在插入前触发检查约束的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 触发器 触发器应用场景--复杂的安全性检查

如何编写唯一约束作为触发器?

SQLServer触发器的问题

postgresql无法创建触发器

oracle触发器的小例子

Mysql触发器用于在插入前检查表中的重复记录