Supongo que necesitarías un disparador como este:
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;
Tenga en cuenta que FOR EACH ROW
¡la cláusula no se da!
De lo contrario, el activador ejecuta solo la fila actualmente insertada/actualizada, pero no se compara con ningún dato existente.
Considere también casos como este:
En la tabla, tiene un período del 1 al 30 de agosto, luego intenta agregar un período del 1 de mayo al 31 de diciembre. Por supuesto, tales situaciones también deben ser bloqueadas por el gatillo. Por lo tanto, solo necesita un disparador a nivel de instrucción, es decir, un disparador a nivel de fila que comprueba que solo la fila insertada/actualizada no es suficiente.