Oracle SQL触发器上的变异表

时间:2017-04-20 13:31:07

标签: sql oracle triggers

我正在尝试触发但是我得到了一个变异表错误。 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。那么,我该如何防止变异表?

2 个答案:

答案 0 :(得分:0)

常见的解决方案是Using Compound Triggers to Avoid Mutating-Table Error

更好的是,不要尝试使用触发器来实现复杂的业务逻辑。相反,使用实现业务规则的过程insert_contract构建API包,并确保(通过权限)用户调用该API而不是直接插入表中。触发器可能会很快变得非常混乱。

答案 1 :(得分:0)

你的触发器在更新或插入CONTRACTS时触发,然后尝试更新CONTRACTS,它会触发触发器......看到问题?

您需要计算结束日期,然后实际执行插入/更新。