Искате нещо подобно:
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;
Въпреки това, той актуализира таблицата, която тригерът наблюдава, и изглежда вероятно тригерът да причини актуализации, които ще извикат тригера отново и ще получат грешка в променящата се таблица.
Може би е по-добре да обвиете бизнес логиката си в съхранена процедура, където тя може да извърши актуализацията на предишните редове и след това да извърши вмъкването/актуализацията. След това, вместо да изпълнявате DML изрази директно върху таблицата, вместо това извикайте съхранената процедура.