त्रुटि: बनाने के लिए किसी स्कीमा का चयन नहीं किया गया है


38

मैं एक अमेज़ॅन आरडीएस पोस्टग्रेजिकल डेटाबेस पर काम कर रहा हूं, जहां मुझे पता है कि सार्वजनिक स्कीमा के साथ कुछ समस्या थी (शायद इसे हटा दिया गया था)। लेकिन जाहिरा तौर पर स्कीमा मौजूद है, और वैसे भी समस्या हल नहीं हुई है। यहाँ एक नया खाली डेटाबेस के साथ एक नमूना सत्र है:

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

कोई संकेत? मुझे क्या खोजना चाहिए?

हल किया। डैनियल वेत्रे के उत्तर के लिए धन्यवाद, मैंने निम्नलिखित के साथ हल किया है:

grant usage on schema public to public;
grant create on schema public to public;

क्या ये सार्वजनिक स्कीमा पर डिफ़ॉल्ट अनुमतियाँ हैं?

मेरे पास एक एकल उपयोगकर्ता है जो डेटाबेस तक पहुंच सकता है, इसलिए मुझे लगता है कि यह वैसे भी सुरक्षा जोखिम नहीं उठा सकता है ...

मुझे लगता है कि मुझे टेम्पलेट 1 पर एक ही संशोधन करना चाहिए । क्या यह सही है? अगर टेम्प्लेट 1 में अनुमतियाँ सही हैं (डिफ़ॉल्ट मान), तो मैं कैसे जाँच सकता हूँ?


3
हो सकता है कि सार्वजनिक स्कीमा में टेबल बनाने के लिए आपके उपयोगकर्ता के पास आवश्यक विशेषाधिकार न हों।
a_horse_with_no_name

निम्नलिखित संपादित करें: हाँ, टेम्पलेट 1 से कनेक्ट करें और स्कीमा अनुमतियों की जांच करें (संपादित उत्तर देखें)।
डैनियल वेरिटा

जवाबों:


34

ऐसा तब होता है जब USAGEकिसी स्कीमा पर विशेषाधिकार नहीं होता है search_path। डिफ़ॉल्ट रूप से छद्म भूमिका public(सभी उपयोगकर्ताओं) के पास publicस्कीमा पर यह विशेषाधिकार होता है, इसलिए यह त्रुटि इसके साथ स्पष्ट रूप से रद्द करने के बाद ही होती है:

revoke usage on schema public from public;

यह आवश्यक है जब यह वांछनीय नहीं है कि लोग टेबल से डेटा का चयन किए बिना (जो विभिन्न विशेषाधिकार के माध्यम से प्रदान किए गए हैं) यहां तक ​​कि अन्य लोगों के स्कीमा में झांकते हैं।

यदि यह REVOKEउस डेटाबेस में नहीं किया गया है, तो हो सकता है कि यह उस टेम्पलेट डेटाबेस में हो जिसके द्वारा नए डेटाबेस को मॉडल किया गया है (देखें CREATE DATABASE)।


जब किसी उपयोगकर्ता के पास USAGEविशेषाधिकार होता है, लेकिन CREATEस्कीमा पर विशेषाधिकार का अभाव होता है , तो ऑब्जेक्ट बनाने की कोशिश करते समय यह एक अलग त्रुटि होती है: स्कीमा जनता के लिए अनुमति से इनकार किया गया

Psql के अंदर विशेषाधिकारों की जाँच करने के लिए, का उपयोग करें \dn+ public

डिफ़ॉल्ट रूप से ( \xपठनीयता के लिए विस्तारित प्रदर्शन के साथ दिखाया गया है):

# # dn + सार्वजनिक
स्कीमा की सूची
- [RECORD 1] ----- + -----------------------
नाम | जनता
मालिक | postgres
पहुँच विशेषाधिकार | postgres = यूसी / postgres
                  | = यूसी / postgres
विवरण | मानक सार्वजनिक स्कीमा

इससे पहले =कि यह सभी भूमिकाओं के लिए एक रोलेन्मे की कमी हो (= सार्वजनिक)

सार्वजनिक उपयोग के विशेषाधिकार के बिना

नाम | जनता
मालिक | postgres
पहुँच विशेषाधिकार | postgres = यूसी / postgres
                  | = सी / postgres
विवरण | मानक सार्वजनिक स्कीमा

सार्वजनिक उपयोग या सृजन विशेषाधिकार के बिना

नाम | जनता
मालिक | postgres
पहुँच विशेषाधिकार | postgres = यूसी / postgres
विवरण | मानक सार्वजनिक स्कीमा

धन्यवाद, यह हल! (मैं प्रश्न में एक नोट लिखूंगा)।
इमानुएल पौलिनी

3

मेरे पास कस्टम स्कीमा में फ़ंक्शंस बनाने के साथ pgdump फ़ाइल थी और मैं कस्टम स्कीमा नाम को आम जनता में बदलना चाहता था और पुराने स्कीमा के साथ सभी घटनाओं को खाली करने के लिए प्रतिस्थापित कर दिया था (उदाहरण के लिए myschema.tablename to tablename) और त्रुटि प्राप्त करना शुरू कर दिया

ERROR:  no schema has been selected to create in

मेरे मामले में त्रुटि तब होती है जब डंप वर्तमान लाइन की शुरुआत में

SELECT pg_catalog.set_config('search_path', '', false);

मैंने "जनता" के लिए दूसरा arg बदल दिया है

SELECT pg_catalog.set_config('search_path', 'public', false);

और समस्या चली गई

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.