किसी दिए गए डेटाबेस और उपयोगकर्ता के लिए search_path क्या है?


43

मैं वर्तमान को इसके search_pathसाथ देख सकता हूं :

show search_path ;

और मैं वर्तमान सत्र के search_pathलिए सेट कर सकता हूं :

set search_path = "$user", public, postgis;

साथ ही, मैं search_pathदिए गए डेटाबेस के लिए स्थायी रूप से सेट कर सकता हूं :

alter database mydb set search_path = "$user", public, postgis ;

और मैं search_pathदी गई भूमिका (उपयोगकर्ता) के लिए स्थायी रूप से सेट कर सकता हूं :

alter role johnny set search_path = "$user", public, postgis ;

लेकिन मैं यह जानना चाहूंगा कि डेटाबेस और भूमिका सेटिंग्स का निर्धारण कैसे करें (सम्मान के साथ search_path) उन्हें बदलने से पहले?

जवाबों:


36

आप कैटलॉग तालिका में भूमिकाओं और डेटाबेस के लिए कॉन्फ़िगरेशन सेटिंग्स पा सकते हैं pg_db_role_setting

यह क्वेरी दी गई भूमिका या डेटाबेस के लिए किसी भी सेटिंग्स को पुनः प्राप्त करती है:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

यदि कुछ भी सेट नहीं किया जाता है, तो अगला निचला उदाहरण डिफ़ॉल्ट स्थिति को निर्धारित करता है search_path, जो postgresql.confइस मामले में है या सर्वर स्टार्ट पर कमांड-लाइन विकल्प। सम्बंधित:

किसी भूमिका या डेटाबेस की किसी भी सेटिंग को अनसेट करने के लिए - इस विशेष उदाहरण में:search_path

ALTER ROLE myrole RESET search_path;

या:

ALTER DATABASE mydb RESET search_path;

या:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

सिस्टम कैटलॉग में डेटा को कभी भी हेरफेर न करें ( pg_catalog.*) मैन्युअल रूप से। के रूप में ALTER ROLEऔर के लिए निर्देश में DDL कमांड का उपयोग करें ALTER DATABASE
अनिवार्य रूप से, RESETकमांड pg_db_role_settingफिर से प्रभावी होने के लिए आधार सेटिंग को अनुमति देने से एक पंक्ति हटाता है । मैं उस दृढ़ फोन को नहीं कहूंगा।


वाह। मैंने कल्पना नहीं की थी कि यह इस जटिल होगा। आप किसी दिए गए डेटाबेस और भूमिका सेटिंग को कैसे परेशान करेंगे ? निष्पादित करने के बाद मैंने देखा कि (मेरी भूमिका के अनुसार) मूल्य मिला । इसके अलावा, अब एक अतिरिक्त पंक्ति दिखाता है। और निष्पादित करने के बाद मैं एक संबंधित पंक्ति को देखता हूं - अंत में, मैं इन परिवर्तनों को "पूर्ववत" करने के तरीके के बारे में अनिश्चित हूं। alter role myrole set search_path = "$user", public, postgis ;pg_roles.rolconfig{"search_path=\"$user\", public, postgis"}select * from pg_db_role_setting ;alter database mydb set search_path = "$user", public, postgis ;select * from pg_db_role_setting ;
user664833

@ user664833: मैंने परेशान करने के लिए निर्देश जोड़े।
इरविन ब्रान्डसेट्टर

6

दोनों डेटाबेस और भूमिकाओं के लिए स्थायी सेटिंग्स pg_db_role_settings सिस्टम क्लस्टर-वाइड टेबल में संग्रहीत की जाती हैं ।

केवल परिवर्तित सेटिंग्स मौजूद हैं। यदि डेटाबेस या भूमिका के लिए खोज पथ को कभी संशोधित नहीं किया गया था, तो मुझे लगता है कि इसे माना जा सकता है "$user",public

  • किसी भी परिवर्तन से पहले सेटिंग का मान, क्लस्टर स्तर पर (वैश्विक कॉन्फ़िगरेशन के माध्यम से postgresql.conf) डेटाबेस से लिया जा सकता है:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • सत्र के भीतर किसी भी परिवर्तन से पहले सेटिंग का मान ( SETकमांड के माध्यम से ) डेटाबेस से दिया जा सकता है:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • जब यह एक गैर-डिफ़ॉल्ट मान सेट करता है postgresql.conf, तो यह वर्तमान सत्र में स्वतंत्र रूप से SQL में उस मूल्य को प्राप्त करने के लिए सीधा नहीं है । pg_settings.boot_valऐसा नहीं होगा क्योंकि यह कॉन्फ़िगरेशन फ़ाइल में परिवर्तनों को अनदेखा करता है, और pg_settings.reset_valया तो नहीं करेगा, क्योंकि यह संभावित रूप से सेट किए गए डेटाबेस / उपयोगकर्ता सेटिंग्स से प्रभावित होता है ALTER USER/ALTER DATABASE। डीबीए के लिए मूल्य प्राप्त करने का सबसे सरल तरीका यह है कि आप इसे ऊपर देखें postgresql.conf। अन्यथा, वैश्विक, क्लस्टर डिफ़ॉल्ट पर रीसेट करें_ खोजें देखें जो इस विषय को विस्तार से कवर करता है।


नहीं है boot_valवास्तव में संकलित में फ़ैक्टरी डिफ़ॉल्ट, में सेटिंग नहीं postgresql.conf?
एरविन ब्रान्डस्टेट्टर

@ इरविन: हाँ। एक के reset_valबजाय देखने के लिए चाहते हो सकता है boot_val
डैनियल वेरिटे

हम्म, डेटाबेस या रोल सेटिंग्स में मान को अधिलेखित कर देता है reset_val। मैं इस पुराने सवाल पर इस हालिया शोध पर ठोकर खा गया: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter

@ इरविन: ISTM कि postgresql.conf से मान प्राप्त करना ज्यादातर मामलों में एक XY समस्या है। वैसे भी, मैंने नए प्रश्न से लिंक करने और थोड़ा विस्तार करने के लिए उत्तर को संपादित किया।
डैनियल वेरिटे

3
select * from pg_user;

पोस्टग्रेज और रेडशिफ्ट के लिए सही है। यह उन पिछले उत्तरों की तुलना में बहुत सरल लगता है जो निर्भर करते हैं pg_db_role_setting, लेकिन useconfigकॉलम में उपयोगकर्ता कॉन्फ़िगरेशन की एक सूची होगी search_path, जिसमें एक सूची के रूप में प्रारूपित किया जाएगा।

pg_user प्रलेखन को यहां पोस्ट किया गया है

अधिक चयनात्मक होना:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

मुझे लगता है कि इस उपयोगकर्ता तालिका में क्लस्टर के सभी उपयोगकर्ता शामिल हैं, न कि केवल विशिष्ट डीबी - लेकिन मैंने इसे सत्यापित नहीं किया।


भूमिका उपयोगकर्ता के समान नहीं है। ;)
विक

विक आप विस्तृत कर सकते हैं? Postgres doc succinct हैं और कहते हैं कि उपयोगकर्ता और भूमिका अब अलग-अलग अवधारणाएं नहीं हैं, लेकिन मैं DBA नहीं हूं और अधिक इनपुट पसंद करूंगा। postgresql.org/docs/current/static/user-manag.html
मर्लिन

2
कोई भी 'भूमिका' उपयोगकर्ता, समूह या दोनों के रूप में कार्य कर सकता है। लेकिन एक उपयोगकर्ता 'एक दूसरे में अंतर करने के लिए निहित है। कैटलॉग की समीक्षा करते हुए हम देखते हैं कि विचार pg_role और pg_user दोनों संदर्भ तालिका pg_authid है, लेकिन उपयोगकर्ताओं के लिए विधेय rolcanlogin के साथ। Your उपयोगकर्ता ’आपके डेटाबेस में प्रवेश कर सकते हैं और आम तौर पर ization भूमिका’ प्राधिकरण के सेट को परिभाषित करते हैं जो उपयोगकर्ताओं को विरासत में मिलते हैं।
विक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.