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 - 在插入前触发检查约束的主要内容,如果未能解决你的问题,请参考以下文章