Myślę, że potrzebujesz wyzwalacza takiego jak ten:
CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
AFTER INSERT OR UPDATE
ON EPOCA
c INTEGER;
BEGIN
SELECT COUNT(*)
INTO c
FROM EPOCA e
WHERE EXISTS (
SELECT 1
FROM EPOCA ee
WHERE (e.DATA_INI BETWEEN ee.DATA_INI AND ee.DATA_FIM
OR e.DATA_FIM BETWEEN ee.DATA_INI AND ee.DATA_FIM)
AND ee.ROWID <> e.ROWID);
IF c > 0 THEN
RAISE_APPLICATION_ERROR(-20021, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
END IF;
END;
Zauważ, że FOR EACH ROW
klauzula nie jest podana!
W przeciwnym razie wyzwalacz wykonuje tylko aktualnie wstawiony/zaktualizowany wiersz, ale nie porównuje z żadnymi istniejącymi danymi.
Rozważ także takie przypadki:
W tabeli masz okres od 1 do 30 sierpnia, następnie próbujesz dodać okres od 1 maja do 31 grudnia. Oczywiście takie sytuacje również powinien być blokowany przez spust. W związku z tym potrzebny jest tylko wyzwalacz na poziomie instrukcji, tj. wyzwalacz na poziomie wiersza, który sprawdza tylko wstawiony/zaktualizowany wiersz, nie jest wystarczający.