Immagino che avresti bisogno di un trigger come questo:
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;
Nota, il FOR EACH ROW
la clausola non è data!
In caso contrario, il trigger esegue solo la riga attualmente inserita/aggiornata ma non viene confrontata con i dati esistenti.
Considera anche casi come questo:
Nella tabella hai un periodo dal 1° al 30 agosto, poi provi ad aggiungere il periodo dal 1° maggio al 31 dicembre. Naturalmente, tali situazioni dovrebbero essere bloccate anche dal grilletto. Quindi è necessario solo un trigger a livello di istruzione, ovvero un trigger a livello di riga che controlli solo la riga inserita/aggiornata non è sufficiente.