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

How to write a trigger that checks an updated value in Oracle?

对于一项作业,我需要编写一个 Oracle SQL 触发器来防止 STUDENT table 中的 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 0'); 
end if;
end; 
/ 
show error; 

只需使用:

Current_Balance := :new.StdBalance;

而不是

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

抑制突变错误。

P.S。即使在这些情况下使用此类赋值,正如 David Faber 警告的那样,也没有必要 return Current_Balance 的值,:new.StdBalance 可以直接用于与 IF :new.StdBalance > 500 ... 进行比较.