स्कीमा खोज पथ क्या है search_path
?
मैनुअल:
<ब्लॉककोट>[...] तालिकाओं को अक्सर अयोग्य नामों से संदर्भित किया जाता है, जिसमें केवल तालिका का नाम होता है। सिस्टम यह निर्धारित करता है कि खोज पथ का अनुसरण करके कौन सी तालिका अभिप्रेत है, जो देखने के लिए स्कीमा की सूची है ।
बोल्ड जोर मेरा। यह पहचानकर्ता समाधान की व्याख्या करता है ।
“वर्तमान स्कीमा” (या "डिफ़ॉल्ट स्कीमा"), प्रति दस्तावेज़ीकरण है:
<ब्लॉककोट>
खोज पथ में नामित पहला स्कीमा currentschema . कहा जाता है . खोजी गई पहली स्कीमा होने के अलावा, यह स्कीमा भी है जिसमें CREATE TABLE
होने पर नई तालिकाएं बनाई जाएंगी कमांड स्कीमा नाम निर्दिष्ट नहीं करता है।
बोल्ड जोर मेरा। सिस्टम स्कीमा pg_temp
(वर्तमान सत्र की अस्थायी वस्तुओं के लिए स्कीमा) और pg_catalog
स्वचालित रूप से खोज पथ का हिस्सा हैं और खोजे गए पहले , इस क्रम में। मैनुअल:
pg_catalog
हमेशा प्रभावी ढंग से खोज पथ का हिस्सा होता है। यदि पथ में इसका स्पष्ट रूप से नाम नहीं है तो इसे पहले . परोक्ष रूप से खोजा जाता है पथ के स्कीमा खोज रहे हैं। यह सुनिश्चित करता है कि बिल्ट-इन नाम हमेशा खोजने योग्य होंगे। हालांकि, आप स्पष्ट रूप से pg_catalog
डाल सकते हैं अपने खोज पथ के अंत में यदि आप चाहते हैं कि उपयोगकर्ता-परिभाषित नाम अंतर्निर्मित नामों को ओवरराइड करें।
मूल के अनुसार बोल्ड जोर। और pg_temp
इससे पहले आता है, जब तक कि इसे किसी भिन्न स्थिति में नहीं रखा जाता है।
इसे कैसे सेट करें?
रनटाइम वैरिएबल सेट करने के कई तरीके हैं search_path
.
-
एक क्लस्टर सेट करें
postgresql.conf
. में सभी डेटाबेस में सभी भूमिकाओं के लिए व्यापक डिफ़ॉल्ट (और पुनः लोड)। इससे सावधान!search_path = 'blarg,public'
इस सेटिंग के लिए शिप किया गया डिफ़ॉल्ट है:
<ब्लॉककोट>search_path = "$user",public
पहला तत्व निर्दिष्ट करता है कि वर्तमान उपयोगकर्ता के समान नाम वाला एक स्कीमा खोजा जाना है। यदि ऐसी कोई स्कीमा मौजूद नहीं है, तो प्रविष्टि को अनदेखा कर दिया जाता है।
-
इसे एक डेटाबेस . के लिए डिफ़ॉल्ट के रूप में सेट करें :
ALTER DATABASE test SET search_path = blarg,public;
-
इसे भूमिका . के लिए डिफ़ॉल्ट के रूप में सेट करें आप (प्रभावी क्लस्टर-व्यापी) से जुड़ते हैं:
ALTER ROLE foo SET search_path = blarg,public;
-
या यहां तक कि (अक्सर सबसे अच्छा!) डेटाबेस में भूमिका के लिए डिफ़ॉल्ट रूप से :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
अपनी स्क्रिप्ट के शीर्ष पर कमांड लिखें। या इसे अपने डीबी सत्र . में निष्पादित करें :
SET search_path = blarg,public;
-
एक विशिष्ट
search_path
सेट करें किसी फ़ंक्शन के दायरे . के लिए (पर्याप्त विशेषाधिकार वाले दुर्भावनापूर्ण उपयोगकर्ताओं से सुरक्षित रहने के लिए)।SECURITY DEFINER
लिखने के बारे में पढ़ें मैनुअल में सुरक्षित रूप से कार्य करता है।
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
मेरी सूची में उच्च संख्या कम संख्या को मात देती है।
मैनुअल में और भी तरीके हैं , जैसे पर्यावरण चर सेट करना या कमांड-लाइन विकल्पों का उपयोग करना।
वर्तमान सेटिंग देखने के लिए:
SHOW search_path;
इसे रीसेट करने के लिए:
RESET search_path;
मैनुअल:
<ब्लॉककोट>
डिफ़ॉल्ट मान को उस मान के रूप में परिभाषित किया जाता है जो पैरामीटर के पास होता, यदि कोई SET
. नहीं होता इसके लिए वर्तमान सत्र में कभी भी जारी किया गया था।