sql >> Base de Datos >  >> RDS >> Oracle

Problemas al cambiar la fecha con un disparador en Oracle

Quieres algo como esto:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
BEGIN
  UPDATE CONTRACTS
  SET    ENDDATE   = :NEW.STARTDATE - INTERVAL '1' DAY
  WHERE  CLIENTID  = :NEW.CLIENTID
  AND    ENDDATE   > :NEW.STARTDATE
  AND    STARTDATE < :NEW.STARTDATE;
END;

Sin embargo, está actualizando la tabla que el disparador está monitoreando y parece probable que el disparador cause actualizaciones que invocarán al disparador nuevamente y obtendrán un error de tabla mutante.

Es posible que sea mejor envolver su lógica comercial en un procedimiento almacenado donde pueda realizar la actualización en las filas anteriores y luego hacer la inserción/actualización. Luego, en lugar de realizar declaraciones DML directamente en la tabla, invoque el procedimiento almacenado.