Ik denk dat je een trigger zoals deze nodig hebt:
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;
Let op, de FOR EACH ROW
clausule is niet gegeven!
Anders voert de trigger alleen de momenteel ingevoegde/bijgewerkte rij uit, maar wordt niet vergeleken met bestaande gegevens.
Overweeg ook gevallen als deze:
In de tabel heb je een periode van 1 t/m 30 augustus, dan probeer je een periode van 1 mei t/m 31 december toe te voegen. Natuurlijk moeten dergelijke situaties ook worden geblokkeerd door de trigger. U hebt dus alleen een trigger op instructieniveau nodig, d.w.z. een trigger op rijniveau die alleen de ingevoegde/bijgewerkte rij controleert, is niet voldoende.