如何编写检查Oracle中更新值的触发器?

时间:2018-04-11 21:37:18

标签: sql oracle plsql database-trigger

对于赋值,我需要编写一个Oracle SQL触发器,以防止STUDENT表中的StdBalance列超过500.通常我会使用检查约束来强制执行此操作,但是我被迫为它编写触发器。正如预期的那样,由于我在更新触发器中使用SELECT,Oracle会抛出一个变异错误,并且不会让我用任何东西更新StdBalance值。有谁知道如何解决这个问题?这是触发器的代码。

CREATE OR REPLACE TRIGGER Balance_Trigger
BEFORE UPDATE ON STUDENT 
FOR EACH ROW 
DECLARE 
Current_Balance NUMBER;
BEGIN 
SELECT :new.StdBalance 
INTO Current_Balance 
FROM STUDENT 
WHERE :new.stdID = StdID;
IF Current_Balance > 500
THEN Raise_Application_error(-20007, 'You cannot exceed an unpaid balance of $500'); 
end if;
end; 
/ 
show error; 

1 个答案:

答案 0 :(得分:2)

只需使用:

Current_Balance := :new.StdBalance;

而不是

SELECT :new.StdBalance 
INTO Current_Balance 
FROM STUDENT 
WHERE :new.stdID = StdID;

抑制变异错误。

P.S。即使在这些情况下使用此类任务,正如David Faber所警告的那样,无需返回Current_Balance的值,:new.StdBalance可以直接用于IF :new.StdBalance > 500 ...的比较。