PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

search_path पहचानकर्ता संकल्प और वर्तमान स्कीमा को कैसे प्रभावित करता है

स्कीमा खोज पथ क्या है search_path ?

मैनुअल:

<ब्लॉककोट>

[...] तालिकाओं को अक्सर अयोग्य नामों से संदर्भित किया जाता है, जिसमें केवल तालिका का नाम होता है। सिस्टम यह निर्धारित करता है कि खोज पथ का अनुसरण करके कौन सी तालिका अभिप्रेत है, जो देखने के लिए स्कीमा की सूची है ।

बोल्ड जोर मेरा। यह पहचानकर्ता समाधान की व्याख्या करता है ।

“वर्तमान स्कीमा” (या "डिफ़ॉल्ट स्कीमा"), प्रति दस्तावेज़ीकरण है:

<ब्लॉककोट>

खोज पथ में नामित पहला स्कीमा currentschema . कहा जाता है . खोजी गई पहली स्कीमा होने के अलावा, यह स्कीमा भी है जिसमें CREATE TABLE होने पर नई तालिकाएं बनाई जाएंगी कमांड स्कीमा नाम निर्दिष्ट नहीं करता है।

बोल्ड जोर मेरा। सिस्टम स्कीमा pg_temp (वर्तमान सत्र की अस्थायी वस्तुओं के लिए स्कीमा) और pg_catalog स्वचालित रूप से खोज पथ का हिस्सा हैं और खोजे गए पहले , इस क्रम में। मैनुअल:

<ब्लॉककोट>

pg_catalog हमेशा प्रभावी ढंग से खोज पथ का हिस्सा होता है। यदि पथ में इसका स्पष्ट रूप से नाम नहीं है तो इसे पहले . परोक्ष रूप से खोजा जाता है पथ के स्कीमा खोज रहे हैं। यह सुनिश्चित करता है कि बिल्ट-इन नाम हमेशा खोजने योग्य होंगे। हालांकि, आप स्पष्ट रूप से pg_catalog डाल सकते हैं अपने खोज पथ के अंत में यदि आप चाहते हैं कि उपयोगकर्ता-परिभाषित नाम अंतर्निर्मित नामों को ओवरराइड करें।

मूल के अनुसार बोल्ड जोर। और pg_temp इससे पहले आता है, जब तक कि इसे किसी भिन्न स्थिति में नहीं रखा जाता है।

इसे कैसे सेट करें?

रनटाइम वैरिएबल सेट करने के कई तरीके हैं search_path .

  1. एक क्लस्टर सेट करें postgresql.conf . में सभी डेटाबेस में सभी भूमिकाओं के लिए व्यापक डिफ़ॉल्ट (और पुनः लोड)। इससे सावधान!

    search_path = 'blarg,public'
    

    इस सेटिंग के लिए शिप किया गया डिफ़ॉल्ट है:

    search_path = "$user",public
    
    <ब्लॉककोट>

    पहला तत्व निर्दिष्ट करता है कि वर्तमान उपयोगकर्ता के समान नाम वाला एक स्कीमा खोजा जाना है। यदि ऐसी कोई स्कीमा मौजूद नहीं है, तो प्रविष्टि को अनदेखा कर दिया जाता है।

  2. इसे एक डेटाबेस . के लिए डिफ़ॉल्ट के रूप में सेट करें :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. इसे भूमिका . के लिए डिफ़ॉल्ट के रूप में सेट करें आप (प्रभावी क्लस्टर-व्यापी) से जुड़ते हैं:

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. या यहां तक ​​कि (अक्सर सबसे अच्छा!) डेटाबेस में भूमिका के लिए डिफ़ॉल्ट रूप से :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. अपनी स्क्रिप्ट के शीर्ष पर कमांड लिखें। या इसे अपने डीबी सत्र . में निष्पादित करें :

    SET search_path = blarg,public;
    
  6. एक विशिष्ट 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 . नहीं होता इसके लिए वर्तमान सत्र में कभी भी जारी किया गया था।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 9.4 के jsonb प्रकार को फ्लोट में कैसे बदलें

  2. GIS:PostGIS/PostgreSQL बनाम MySql बनाम SQL सर्वर?

  3. हेरोकू पीजी:स्कीमा को पॉप्युलेट करने में विफल खींचें

  4. तालिका के लिए अज्ञात प्राथमिक कुंजी प्राप्त करना जबकि आईडी है

  5. PostgreSQL में समानांतर अननेस्ट () और सॉर्ट ऑर्डर