Jeg gætter på, at du har brug for en trigger som denne:
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;
Bemærk, FOR EACH ROW
klausul er ikke givet!
Ellers udfører triggeren kun den aktuelt indsatte/opdaterede række, men sammenligner ikke med nogen eksisterende data.
Overvej også tilfælde som dette:
I tabellen har du en periode fra 1. til 30. august, derefter forsøger du at tilføje periode for 1. maj til 31. december. Naturligvis bør sådanne situationer også blokeres af udløseren. Du behøver således kun en udløser på sætningsniveau, dvs. en udløser på rækkeniveau, som kontrollerer, at kun den indsatte/opdaterede række ikke er tilstrækkelig.