मुझे लगता है कि आपको इस तरह के ट्रिगर की आवश्यकता होगी:
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 दिसंबर तक की अवधि जोड़ने का प्रयास करें। बेशक, ऐसी स्थितियों को भी ट्रिगर द्वारा अवरुद्ध किया जाना चाहिए। इस प्रकार आपको केवल एक कथन-स्तरीय ट्रिगर की आवश्यकता है, यानी एक पंक्ति स्तर ट्रिगर जो केवल सम्मिलित/अपडेट की गई पंक्ति की जांच करता है, पर्याप्त नहीं है।