我想创建一个简单的触发器来检查表中存储的变量
如果变量的值为“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”,此触发器也会禁用所有条目。
答案 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)
您正在引用旧数据而不是新数据 - 可能这不是您的意图?