Saya kira Anda akan membutuhkan pemicu seperti ini:
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;
Perhatikan, FOR EACH ROW
klausa tidak diberikan!
Jika tidak, pemicu hanya menjalankan baris yang saat ini dimasukkan/diperbarui tetapi tidak membandingkan dengan data yang ada.
Pertimbangkan juga kasus seperti ini:
Dalam tabel Anda memiliki periode dari 1 hingga 30 Agustus, kemudian Anda mencoba menambahkan periode untuk 1 Mei hingga 31 Desember. Tentu saja, situasi seperti itu juga harus diblokir oleh pemicunya. Jadi, Anda hanya memerlukan pemicu tingkat pernyataan, yaitu pemicu tingkat baris yang hanya memeriksa baris yang dimasukkan/diperbarui tidak cukup.