我试图做一个触发器,但我得到了一个突变表错误。 SQL代码是这样的:Oracle SQL触发器上的突变表
CREATE OR REPLACE TRIGGER CHK_Apartado_D
BEFORE INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
errorvisualizacion EXCEPTION;
local_enddate DATE;
BEGIN
SELECT enddate INTO local_enddate FROM CONTRACTS WHERE clientid=:new.clientid;
IF local_enddate > SYSDATE OR local_enddate IS NULL
THEN
UPDATE CONTRACTS SET enddate = SYSDATE - 1 WHERE clientid=:new.clientid;
END IF;
END CHK_Apartado_B;
/
而我得到的错误是这样的:
Informe de error -
Error SQL: ORA-04091: table HR.CONTRACTS is mutating, trigger/function may not see it
ORA-06512: at "HR.CHK_APARTADO_D", line 5
ORA-04088: error during execution of trigger 'HR.CHK_APARTADO_D'
ORA-06512: at "HR.CHK_APARTADO_D", line 8
ORA-04088: error during execution of trigger 'HR.CHK_APARTADO_D'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.
当我插入一个新的合同我要检查,如果该客户端在实际的其他合同日期,如果他有我必须更新结束日期contracte到昨天,让新的INSERT。那么,我该如何防止变异表呢?
这似乎是一个最近令人困惑的练习: [here](http://stackoverflow.com/q/43494370/266304),[here](http://stackoverflow.com/q/43483253/266304),[here](http://stackoverflow.com/ q /二十六万六千三百○四分之四千三百二十三万八千四百八十八);哦,去年的这个时候,[这里](http://stackoverflow.com/q/36372988/266304),... –
@AlexPoole - 似乎我们需要一个规范的答案,只是继续关闭重复。 – APC
@APC - 是一个规范的答案,将有效地作为适当的分配答案,但?尽管我不确定我是否看到过任何地方的作业,暗示了分配者实际上在寻找什么答案......或者至少不是答案,我会很乐意尝试写出* 8-) –