जवाबों:
एक्सटेंशन स्थापित न करें 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
।
सम्बंधित:
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.
pg_catalog
भी स्थापित करता है । (यदि आप इसे बदलने का प्रयास करते हैं तो यह एक त्रुटि फेंकता है।) क्या यह फ़ंक्शन के लिए प्रक्रियात्मक भाषा एक्सटेंशन स्थापित करने का एक मानक है?
एक्सटेंशन स्थापित कर 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
एक्सटेंशन के लिए बस डिफ़ॉल्ट स्कीमा का उपयोग करें।
plpgsql
विस्तार तो किसी भी तरह इस नियम का अपवाद है? मैंने जो कुछ देखा है, उसे pg_catalog में इस एक्सटेंशन को देखा है