Myslím, že byste potřebovali spouštěč, jako je tento:
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;
Poznámka:FOR EACH ROW
doložka není dána!
Jinak spouštěč provede pouze aktuálně vložený/aktualizovaný řádek, ale neporovnává se s žádnými existujícími daty.
Zvažte také případy jako je tento:
V tabulce máte období od 1. do 30. srpna, poté zkuste přidat období za 1. května do 31. prosince. Samozřejmě i takové situace by měla spoušť blokovat. Potřebujete tedy pouze trigger na úrovni příkazu, tj. trigger na úrovni řádku, který kontroluje pouze vložený/aktualizovaný řádek, nestačí.