2011-09-13 12 views
9

के रूप में काम नहीं कर रहा है मैं RedHat पर PostgreSQL 9.0.3 का उपयोग कर रहा हूं। डेटाबेस में दो स्कीमा, public और wh शामिल हैं। मैंने django नामक एक नई भूमिका बनाई। मैं चाहता हूं कि यह उपयोगकर्ता wh स्कीमा का उपयोग डिफ़ॉल्ट रूप से करें।PostgreSQL search_path विज्ञापन विज्ञापित

मैनुअल के बाद, मैंने किया था:

ALTER USER django SET SEARCH_PATH TO wh, public; 

यह प्रतीत होता है काम करने के लिए:

SHOW SEARCH_PATH; 
search_path 
------------- 
wh, public 

हालांकि, अगर मैं तो एक \dt, केवल सार्वजनिक स्कीमा से टेबल प्रदर्शित होते हैं। मैनुअल में, खोज पथ को बदलने का तत्काल प्रभाव होना चाहिए, और मुझे उपसर्ग के बिना wh टेबल तक पहुंचने में सक्षम होना चाहिए, लेकिन ऐसा नहीं है। लॉग इन और आउट search_path में परिवर्तनों को संरक्षित करता है लेकिन व्यवहार में कोई बदलाव नहीं दिखाता है।

मुझे क्या याद आ रही है?

उत्तर

11

यह आपकी समस्या का समाधान हो सकता है (या सभी को अनुदान दें ... यदि 0 वांछित है तो आप चाहते हैं।)

search_path सेट करना पोस्टग्रेज़ को लू को निर्देशित करता है सूचीबद्ध schemas में वस्तुओं के लिए के। यह देखने के लिए अनुमति नहीं देता है कि वहां क्या है। यदि "django" में आवश्यक विशेषाधिकार नहीं हैं, \dt उस जानकारी को प्रदर्शित नहीं करना चाहिए (और नहीं)।

दूसरी तरफ, यदि आप पहले ही सुपरसियर के रूप में प्रयास कर चुके हैं (पिछले सुझाव पर आपकी टिप्पणी के अनुसार), तो यह हो सकता है ...

+0

हाय इरविन, यह काम किया! यह मेरे लिए बहुत अजीब है कि इस भूमिका के लिए सुपरसुर देने से यह पूरा नहीं हुआ। हालांकि, स्कीमा पर स्पष्ट अनुदान व्यवहार को सही बनाता है। योगदान देने वाले सभी के लिए बहुत बहुत धन्यवाद और धन्यवाद। – talonsensei

+1

स्कीमा योग्यता के बिना किसी तालिका को पूछताछ करते समय जैसे कि 'मेरा चयन करें' से चुनें, पीजी कहेंगे 'रिलेशनशिप "मायटेबल" अस्तित्व में नहीं है ", जो थोड़ा भ्रामक है क्योंकि आप जानते हैं कि यह अस्तित्व में है, लेकिन शायद आपके पास नहीं है पहुंच। इसलिए जब आप तालिका को उचित रूप से योग्य स्कीमा नाम के साथ पूछते हैं जैसे 'myschema.mytable से SELECT id'; आपको इसके बजाय संदेश प्राप्त होगा: 'अनुमति स्कीमा के लिए अस्वीकार कर दी गई है ..' जो स्पष्ट रूप से 'स्कीमा पर अनुदान उपयोग को इंगित करता है .. 'कथन की जरूरत है। प्रश्नों में पूरी तरह से योग्य स्कीमा नामों का उपयोग करने का यह एक और कारण है कि एक अच्छा विचार है। –

+0

अरे एरविन, समाधान के लिए धन्यवाद, आपने मुझे बचा लिया है! :-) और प्रश्न पूछने के लिए talonsensei के लिए धन्यवाद :-) – shahjapan

0

यह \dt कमांड की सीमा हो सकता है।

यह सत्यापित करने के लिए कि search_path ठीक से काम कर रहा है, SELECT * FROM some_table चलाने की कोशिश करें जहां some_table वह है जो wh schema में स्थित है।

+0

सुझाव के लिए धन्यवाद। मैंने कोशिश की, लेकिन मुझे एक त्रुटि मिल रही है कि तालिका मौजूद नहीं है। यदि मैं क्वेरी के साथ क्वेरी उपसर्ग करता हूं, तो यह काम करता है। तो यह एक \ dt सीमा – talonsensei

0

मैंने विंडोज 64-बिट पर इसे अभी (केवल रिलीज़) 9.1 पर परीक्षण किया और यह निर्दिष्ट के रूप में काम किया। ALTER ROLE मैनपेज से

अंश:

शेष वेरिएंट, एक विन्यास चर के लिए एक भूमिका के सत्र डिफ़ॉल्ट को परिवर्तित या तो सभी डेटाबेस या, जब में डेटाबेस खंड निर्दिष्ट किया जाता है, केवल में सत्र के लिए के लिए नाम डेटाबेस। जब भी भूमिका एक नए सत्र को शुरू करती है, तो निर्दिष्ट मान सत्र डिफ़ॉल्ट बन जाता है, पोस्टग्रेस्क्ल.कॉफ़ में मौजूद जो भी सेटिंग ओवरराइड करता है या कमांड लाइन से प्राप्त किया गया है। यह केवल लॉगिन समय पर होता है; एसईटी ROLE या सेट सत्र प्राधिकरण को निष्पादित करने के लिए नए कॉन्फ़िगरेशन मान सेट करने का कारण नहीं है।

GRANT USAGE ON SCHEMA wh TO django; 

(। या जो एक (प्रत्यक्ष या अप्रत्यक्ष) सदस्य के रूप में Django है किसी भी भूमिका के लिए अनुदान उपयोग)
:

(जोर मेरा)

+0

प्रतीत नहीं होता है धन्यवाद मिलन। मैंने वह किया है। प्राथमिक व्यवस्थापक/सुपरसुर भूमिका के साथ यह काम करता है और एक \ dt केवल wh schema में टेबल दिखाएगा। हालांकि, किसी कारण से मैं समझ नहीं पा रहा हूं, जब मैं इसे किसी अन्य उपयोगकर्ता के लिए करता हूं, तब भी जब मैंने उन्हें व्यवस्थापक/सुपरसुर भी बनाया, तब भी \ nt अभी भी सार्वजनिक टेबल दिखाता है, नहीं, भले ही पथ बदल गया हो। – talonsensei

+0

यदि आप विश्वसनीय रूप से इसे पुन: उत्पन्न कर सकते हैं और एक छोटा परीक्षण केस तैयार कर सकते हैं, तो मेरा मानना ​​है कि डेवलपर्स आपसे सुनना चाहते हैं। लेकिन सबसे पहले आपको यह सुनिश्चित करना होगा कि आप इसका उपयोग कर रहे प्रमुख संस्करण के नवीनतम मामूली संस्करण (9.0.4) पर परीक्षण/पुन: उत्पन्न कर रहे हैं (9.0)। –

+0

धन्यवाद मिलन। यह पुनरुत्पादित है मैं विश्वास करता हूँ। मैंने 9.0.1 (हिम तेंदुए) और 9.0.3 (रेडहाट) दोनों पर परीक्षण किया। – talonsensei

0

PostgreSQL के लिए, एक उपयोगकर्ता एक डेटाबेस से कनेक्ट करने और एक मेज की तरह वस्तुओं के लिए लग रही है, पहले अगर कहीं भी होगी सिर्फ उपयोगकर्ता नाम का एक ही नाम के रूप में स्कीमा के लिए दिखता है, अगर नहीं मिला, यह सार्वजनिक स्कीमा के लिए देखो, आपके मामले में, यदि आप django उपयोगकर्ता के माध्यम से डेटाबेस को कनेक्ट करते हैं, तो यह डिफ़ॉल्ट रूप से स्कीमा django के लिए दिखता है, लेकिन आप वर्तमान स्कीमा चाहते हैं, इसलिए स्कीमा नाम और भूमिका का नाम समान बनाएं, और डेटाबेस को लॉगिन करने के बजाय भूमिका उपसर्ग टाइप किए बिना आपकी समस्या को हल करेगी, बस कोशिश करें!

+0

हाय फ्रैंक, आपका सुझाव सही समझ में आता है और मैंने कोशिश की, लेकिन उपयोगकर्ता के लिए डिफ़ॉल्ट खोज स्थान अभी भी "$ उपयोगकर्ता" है, सार्वजनिक और अभी भी एक \ dt केवल सार्वजनिक टेबल दिखाता है। Current_schemas (true) का आउटपुट {pg_catalog, public} है। तो यह काम नहीं करता है। – talonsensei

+0

अब, आपका उपयोगकर्ता नाम और स्कीमा नाम क्या है? यदि डेटाबेस प्रोड डीबी नहीं है, तो आप दोनों एक ही नाम बना सकते हैं। और तालिका के मालिक का नाम भी देखें। – francs