このようなトリガーが必要になると思います:
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
に注意してください 節が与えられていません!
それ以外の場合、トリガーは現在挿入/更新された行のみを実行し、既存のデータとは比較しません。
次のような場合も検討してください:
この表では、8月1日から30日までの期間があり、5月1日から12月31日までの期間を追加しようとしています。もちろん、そのような状況もトリガーによってブロックされるべきです。したがって、必要なのはステートメントレベルのトリガーだけです。つまり、挿入/更新された行のみをチェックする行レベルのトリガーでは不十分です。