क्या इसे pg_catalog स्कीमा में एक्सटेंशन इंस्टॉल करने की सिफारिश की गई है?


11

चूँकि pg_catalogस्कीमा में वस्तुएँ स्पष्ट रूप से search_path( डॉक्स ) में होती हैं, तो क्या उस स्कीमा में एक्सटेंशन स्थापित करने की सिफारिश की जाएगी?

जवाबों:


16

एक्सटेंशन स्थापित न करें pg_catalog(जब तक कि उनका डिफ़ॉल्ट न हो: बहुत कम एक्सटेंशन उस तरह से डिज़ाइन किए गए हैं), क्योंकि आप सिस्टम कैटलॉग के साथ गड़बड़ नहीं करते हैं, कभी भी@ क्रिस एक कारण बताता है । और भी हैं।

हालांकि, "सार्वजनिक" स्कीमा किसी भी तरह से विशेष नहीं है । यह केवल डिफ़ॉल्ट स्कीमा है जो मानक वितरण में पूर्व-स्थापित है ताकि हम तुरंत शुरू कर सकें। कुछ DB व्यवस्थापक "सार्वजनिक" स्कीमा का उपयोग बिल्कुल नहीं करते हैं, कुछ इसे हटा भी देते हैं।

CREATE EXTENSION"सार्वजनिक" स्कीमा से संबद्ध नहीं है। यह वर्तमान स्कीमा में तब तक स्थापित होता है जब तक कि अन्यथा निर्देश न दिया गया हो - कुछ एक्सटेंशन को छोड़कर एक पूर्व-निर्धारित स्कीमा (जैसे पीजीक्यू / लोंडिस्ट ) होता है। दस्तावेज़ीकरण:

schema_name

स्कीमा का नाम जिसमें एक्सटेंशन की वस्तुओं को स्थापित करना है, यह देखते हुए कि एक्सटेंशन इसकी सामग्री को स्थानांतरित करने की अनुमति देता है। नामित स्कीमा पहले से मौजूद होना चाहिए। यदि निर्दिष्ट नहीं किया गया है, और विस्तार की नियंत्रण फ़ाइल एक स्कीमा को निर्दिष्ट नहीं करती है, तो वर्तमान डिफ़ॉल्ट ऑब्जेक्ट निर्माण स्कीमा का उपयोग किया जाता है

याद रखें कि एक्सटेंशन को किसी भी स्कीमा के भीतर नहीं माना जाता है: एक्सटेंशन में अयोग्य नाम होते हैं जो अद्वितीय डेटाबेस-वाइड होने चाहिए। लेकिन विस्तार से संबंधित वस्तुएं स्कीमा के भीतर हो सकती हैं।

बोल्ड जोर मेरा।
उपयोगकर्ता, स्कीमा और प्रबंधन करने का तरीका तय करें search_path:

फिर तय करें कि एक्सटेंशन कहां स्थापित करना है। आप अपनी पसंद के किसी भी स्कीमा में इंस्टॉल कर सकते हैं और उस स्कीमा को search_pathसभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट रूप से शामिल कर सकते हैं या केवल कुछ या बिना उपयोगकर्ताओं के लिए (ताकि योग्य संदर्भों की आवश्यकता हो)। यह सब इस बात पर निर्भर करता है कि आप क्या हासिल करना चाहते हैं।
आप जो भी करें, लगातार रहें।

मैं एक समर्पित "एक्सटेंशन" स्कीमा में एक्सटेंशन स्थापित करना पसंद करता हूं (जो इसे अनुमति देता है), जिसे मैं "सार्वजनिक" (और "$ उपयोगकर्ता" के search_path बाद डिफ़ॉल्ट में शामिल करता हूं - यदि आप उस का उपयोग करते हैं)। अपने स्वयं के सार्वजनिक कार्यों और अन्य सार्वजनिक वस्तुओं की साफ जुदाई में मदद करता है। में मेरी सेटिंग postgresql.conf:

search_path = "$user",public,extensions

या:

search_path = public,extensions

और मैं इसके साथ एक्सटेंशन स्थापित करता हूं:

CREATE EXTENSION some_extension SCHEMA extensions;

एक बात ध्यान दें: इस तरह से आप extensionsस्कीमा में एक ही नाम की वस्तुओं (और मापदंडों) के पीछे स्कीमा में (अयोग्य) वस्तुओं को "छिपा" सकते हैं public

सम्बंधित:


ठीक है plpgsqlविस्तार तो किसी भी तरह इस नियम का अपवाद है? मैंने जो कुछ देखा है, उसे pg_catalog में इस एक्सटेंशन को देखा है
zam6ak

@ zam6ak: हां, plpgsql एक विशेष मामला है: मैनुअल का हवाला देते हुए :In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Erwin Brandstetter

1
plv8 खुद को pg_catalogभी स्थापित करता है । (यदि आप इसे बदलने का प्रयास करते हैं तो यह एक त्रुटि फेंकता है।) क्या यह फ़ंक्शन के लिए प्रक्रियात्मक भाषा एक्सटेंशन स्थापित करने का एक मानक है?
jpmc26

6

एक्सटेंशन स्थापित कर pg_catalogरहे हैं, जहाँ तक मुझे जानकारी है, सलाह नहीं दी गई है। आपको डिफ़ॉल्ट publicस्कीमा का उपयोग करना चाहिए , जो कि डिफ़ॉल्ट रूप से भी है search_path

क्यों?

एक उदाहरण के रूप में, मैं उस pageinspectविस्तार के साथ काम करूंगा जो मैंने पहले ही publicस्कीमा में बनाया है । सभी कार्य डिफ़ॉल्ट रूप से, डेटाबेस में सभी स्कीमाओं के लिए सुलभ हैं यदि वे publicस्कीमा में स्थित हैं ।

अब, मैं इसे pg_catalogस्कीमा का उपयोग करके स्थानांतरित करने का प्रयास करता हूं

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

और यह ठीक काम करता है।

परंतु...

publicस्कीमा का उपयोग करके इसे फिर से स्थानांतरित करने का प्रयास करें

ALTER EXTENSION pageinspect SET SCHEMA public;

और यह इसे अनुमति नहीं देगा, निम्नलिखित त्रुटि उपज

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

उह ओह! खैर, यह ठीक है कि यह मुझे इसे स्थानांतरित नहीं करने देगा। मैं बस इसे वापस publicलाकर स्कीमा में वापस ला सकता हूं और फिर से बना सकता हूं ? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

ठीक अच्छा। publicस्कीमा में वापस सही जगह है , और फ़ंक्शन अभी भी डेटाबेस में सभी स्कीमाओं के लिए सुलभ हैं।

टी एल, डी आर; publicएक्सटेंशन के लिए बस डिफ़ॉल्ट स्कीमा का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.