我正在尝试触发但是我得到了一个变异表错误。 SQL代码是这样的:
<div>
$452
</div>
<div class="arrow-up"></div>
<div class="big-reward" id="mybox"><span><strong>Big Reward!</strong> Here is a sample text.</span></div>
我得到的错误是:
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;
/
当我插入新合同时,我必须检查该客户在实际日期是否有其他合同,如果他有,我必须将de end date contracte更新为昨天并让新INSERT。那么,我该如何防止变异表?
答案 0 :(得分:0)
常见的解决方案是Using Compound Triggers to Avoid Mutating-Table Error。
更好的是,不要尝试使用触发器来实现复杂的业务逻辑。相反,使用实现业务规则的过程insert_contract
构建API包,并确保(通过权限)用户调用该API而不是直接插入表中。触发器可能会很快变得非常混乱。
答案 1 :(得分:0)
你的触发器在更新或插入CONTRACTS时触发,然后尝试更新CONTRACTS,它会触发触发器......看到问题?
您需要计算结束日期,然后实际执行插入/更新。