Je suppose que vous auriez besoin d'un déclencheur comme celui-ci :
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;
Notez que le FOR EACH ROW
la clause n'est pas donnée !
Sinon, le déclencheur n'exécute que la ligne actuellement insérée/mise à jour, mais ne se compare à aucune donnée existante.
Considérez également des cas comme celui-ci :
Dans le tableau, vous avez une période du 1er au 30 août, puis vous essayez d'ajouter une période du 1er mai au 31 décembre. Bien sûr, de telles situations doivent également être bloquées par le déclencheur. Ainsi, vous n'avez besoin que d'un déclencheur au niveau de l'instruction, c'est-à-dire qu'un déclencheur au niveau de la ligne qui vérifie uniquement la ligne insérée/mise à jour n'est pas suffisant.