Jag antar att du skulle behöva en trigger som denna:
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;
Observera, FOR EACH ROW
klausul ges inte!
Annars utför utlösaren bara den för närvarande infogade/uppdaterade raden men jämförs inte med någon befintlig data.
Tänk även på fall som detta:
I tabellen har du en period från 1:a till 30:e augusti, sedan försöker du lägga till period för 1:a maj till 31:e december. Naturligtvis bör sådana situationer också blockeras av avtryckaren. Därför behöver du bara en utlösare på uttalandenivå, dvs. en utlösare på radnivå som kontrollerar att endast den infogade/uppdaterade raden inte räcker.