Tôi đoán bạn sẽ cần một trình kích hoạt như thế này:
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;
Lưu ý, FOR EACH ROW
mệnh đề không được đưa ra!
Nếu không, trình kích hoạt chỉ thực hiện hàng hiện được chèn / cập nhật nhưng không so sánh với bất kỳ dữ liệu hiện có nào.
Cũng xem xét các trường hợp như thế này:
Trong bảng, bạn có khoảng thời gian từ ngày 1 đến ngày 30 tháng 8, sau đó bạn cố gắng thêm khoảng thời gian từ ngày 1 tháng 5 đến ngày 31 tháng 12. Tất nhiên, những tình huống như vậy cũng nên được ngăn chặn bởi trình kích hoạt. Do đó, bạn chỉ cần trình kích hoạt cấp câu lệnh, tức là trình kích hoạt cấp hàng chỉ kiểm tra hàng được chèn / cập nhật là không đủ.