Предполагам, че ще ви трябва тригер като този:
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;
Обърнете внимание, че FOR EACH ROW
клауза не е дадена!
В противен случай тригерът изпълнява само текущо вмъкнатия/актуализирания ред, но не сравнява с никакви съществуващи данни.
Помислете и за случаи като този:
В таблицата имате период от 1-ви до 30-ти август, след което се опитвате да добавите период от 1-ви май до 31-ви декември. Разбира се, такива ситуации също трябва да бъдат блокирани от спусъка. Следователно имате нужда само от тригер на ниво израз, т.е. тригер на ниво ред, който проверява само вмъкнатия/актуализирания ред, не е достатъчен.