Eu acho que você precisaria de um gatilho 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;
Observe que o
FOR EACH ROW
cláusula não é dada! Caso contrário, o gatilho executa apenas a linha inserida/atualizada no momento, mas não compara com nenhum dado existente.
Considere também casos como este:
Na tabela você tem um período de 1º a 30 de agosto, então você tenta adicionar período de 1º de maio a 31 de dezembro. Obviamente, tais situações também devem ser bloqueadas pelo gatilho. Assim, você precisa apenas de um gatilho de nível de instrução, ou seja, um gatilho de nível de linha que verifica apenas a linha inserida/atualizada não é suficiente.