ग्यूसेप ब्रोकोलो द्वारा लिखित
PostgreSQL 9.3 के बाद से, इसे अपडेट करना और सीधे विचारों में सम्मिलित करना संभव है, जब तक कि दृश्य केवल एक अंतर्निहित तालिका को संदर्भित करता है।
PostgreSQL 9.4 हमें अद्यतन करने योग्य दृश्यों में INSERTs के लिए CHECK क्लॉज का उपयोग करने की अनुमति देता है। उदाहरण के लिए, केवल एक पूर्णांक स्तंभ से बनी तालिका पर विचार करें; और दो विचारों पर विचार करें, एक 2 से विभाज्य संख्याओं पर और एक 3 से विभाज्य संख्याओं पर। यदि हम संख्या 123 को पहले दृश्य में सम्मिलित करने का प्रयास करते हैं:
—-
$ क्रिएट टेबल some_data(id int4 PRIMARY KEY);
तालिका बनाएं
$ चुनें के रूप में पहले देखें * some_data से जहां 0 =आईडी% 2;
दृश्य बनाएं
$ चयन के रूप में दूसरा दृश्य बनाएं * some_data से जहां 0 =id%3;
दृश्य बनाएं
$ INSERT INTO first(id) VALUES (123);
—-
इसे अंतर्निहित तालिका में डाला जाएगा, भले ही दृश्य केवल 2 से विभाज्य संख्याओं के लिए है (इसलिए नया मान दृश्य में दिखाई नहीं देगा)। PostgreSQL 9.4 में CHECK क्लॉज को INSERTs को ठीक से प्रबंधित करने के लिए पेश किया गया है ताकि पहले से जाँच की जा सके कि मान दृश्य की परिभाषा के अनुकूल हैं।
दो संभावित विकल्प हैं:
* कैस्केड चेक - यह डिफ़ॉल्ट विकल्प है, जहां चेक कैस्केड को उसी अंतर्निहित तालिका पर परिभाषित अन्य दृश्यों के लिए चेक करता है
* स्थानीय जाँच - केवल उस दृश्य की जाँच की जाती है जो INSERT का लक्ष्य है
यहाँ यह दिखाया गया है कि उपरोक्त उदाहरण में CHECK क्लॉज का उपयोग कैसे किया जाता है:
—-
$ DROP व्यू पहले;
ड्रॉप व्यू
$ DROP व्यू सेकंड;
ड्रॉप व्यू
$ चयन के रूप में पहले देखें * some_data से जहां 0 =आईडी% 2 चेक विकल्प के साथ;
दृश्य बनाएं
$ चयन के रूप में दूसरा दृश्य बनाएं * some_data से जहां 0 =आईडी% 3 चेक विकल्प के साथ;
दृश्य बनाएं
$ तीसरे के रूप में देखें चुनें * पहले से जहां 0 =आईडी% 3 चेक विकल्प के साथ;
दृश्य बनाएं
$ INSERT INTO first(id) VALUES (14);
INSERT 0 1
$ INSERT INTO first(id) VALUES (15);
त्रुटि: "पहले" देखने के लिए नई पंक्ति चेक विकल्प के साथ उल्लंघन करती है
$ INSERT INTO second(id) VALUES (15);
INSERT 0 1
$ तीसरे (आईडी) मूल्यों में सम्मिलित करें (6);
INSERT 0 1
तीसरे (आईडी) मान (15) में $ INSERT करें;
त्रुटि: "पहले" देखने के लिए नई पंक्ति चेक विकल्प के साथ उल्लंघन करती है
ध्यान दें कि "तीसरा" दृश्य "पहले" दृश्य पर परिभाषित किया गया है।
मान '14' को पहले दृश्य में सही ढंग से डाला गया है, जबकि मान '15' को केवल दूसरे में डाला जा सकता है, पहले नहीं - जैसा कि अपेक्षित था। हम तीसरे दृश्य में '6' डाल सकते हैं क्योंकि यह 3 और 2 दोनों से विभाज्य है। '15' को तीसरे दृश्य में डालने में त्रुटि भले ही वह 3 से विभाज्य हो, क्योंकि यह विभाज्य-दर-2 CHECK क्लॉज का उल्लंघन करता है। मूल दृश्य पर, पहले। इस मामले में, समस्या को हल करने के लिए दोनों विचारों में स्थानीय जांच खंड का उपयोग करना पर्याप्त नहीं है:
—-
$ DROP व्यू पहले;
ड्रॉप व्यू
$ DROP व्यू तीसरा;
ड्रॉप व्यू
$ चयन के रूप में पहले देखें * some_data से जहां 0 =आईडी% 2 स्थानीय जांच विकल्प के साथ;
दृश्य बनाएं
$ तीसरे के रूप में देखें चुनें * पहले से जहां 0 =आईडी% 3 स्थानीय जांच विकल्प के साथ;
दृश्य बनाएं
तीसरे (आईडी) मान (15) में $ INSERT करें;
त्रुटि: "पहले" देखने के लिए नई पंक्ति चेक विकल्प के साथ उल्लंघन करती है
—-
काम करने का उदाहरण यहां दिखाया गया है:
—-
$ DROP व्यू पहले;
ड्रॉप व्यू
$ DROP व्यू तीसरा;
ड्रॉप व्यू
$ चयन के रूप में पहले देखें * some_data से जहां 0 =आईडी% 2;
दृश्य बनाएं
$ तीसरे के रूप में देखें चुनें * पहले से जहां 0 =आईडी% 3 स्थानीय जांच विकल्प के साथ;
दृश्य बनाएं
तीसरे (आईडी) मान (15) में $ INSERT करें;
INSERT 0 1
—-
निष्कर्ष
यह नया चेक तंत्र INSERT चरण के दौरान सीधे अद्यतन करने योग्य दृश्यों पर लागू किया जा सकता है। यह डेटा अखंडता को बनाए रखने में डेटाबेस की भूमिका को अधिक से अधिक मजबूत करता है।