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

Sql 如何在Oracle中编写检查更新值的触发器?,sql,oracle,plsql,database-trigger,Sql,Oracle,Plsql,Database Trigger,对于作业,我需要编写一个Oracle SQL触发器,以防止STUDENT表中的StdBalance列超过500。通常我会使用一个check约束来强制执行这个命令,但是我不得不为它编写一个触发器。正如预期的那样,由于我在更新触发器中使用SELECT,Oracle正在抛出一个变异错误,并且不允许我用任何东西更新StdBalance值。有人知道我该如何解决这个问题吗?这是触发器的代码 CREATE OR REPLACE TRIGGER Balance_Trigger BEFORE UPDATE ON

对于作业,我需要编写一个Oracle SQL触发器,以防止STUDENT表中的StdBalance列超过500。通常我会使用一个check约束来强制执行这个命令,但是我不得不为它编写一个触发器。正如预期的那样,由于我在更新触发器中使用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; 
只需使用:

Current_Balance := :new.StdBalance;
而不是

SELECT :new.StdBalance 
INTO Current_Balance 
FROM STUDENT 
WHERE :new.stdID = StdID;
以抑制突变错误

另一方面,正如David Faber警告的那样,即使在这些情况下使用了此类赋值,也不需要为当前余额返回值,
:new.StdBalance
可以直接用于比较
如果:new.StdBalance>500…
只需使用:

Current_Balance := :new.StdBalance;
而不是

SELECT :new.StdBalance 
INTO Current_Balance 
FROM STUDENT 
WHERE :new.stdID = StdID;
以抑制突变错误


另一方面,正如David Faber警告的那样,即使在这些情况下使用了此类赋值,也不需要为当前余额返回值,
:new.StdBalance
可以直接用于比较
如果:new.StdBalance>500…
,实际上该变量可以完全忽略,而在条件语句中使用了new.stdbalance。@davidaber是的,你说得对,谢谢。因为,
:new.StdBalance
的值已经出现了。StdBalance可以用来代替
当前的\u余额
。实际上这个变量可以完全省略,而new.StdBalance可以用来代替条件。@DavidFaber是的,你说得对,谢谢。因为,
:new的值已经出现。StdBalance
可以用于而不是
当前的\u余额