2012-11-21 7 views
71
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly; 

केवल पढ़ने के लिए उपयोगकर्ता कनेक्ट कर सकते हैं, टेबल देखने के रूप में एक का चयन की कोशिश कर रहा है, लेकिन एक साधारण चयन जब यह करने की कोशिश करता है जबकि यह हो जाता है:त्रुटि: अनुमति पर Postgres संबंध tablename के लिए इनकार कर दिया एक केवल पढ़ने के लिए उपयोगकर्ता

ERROR: permission denied for relation mytable 
SQL state: 42501 

यह पोस्टग्रेएसक्यूएल 9.1

पर क्या हो रहा है मैंने क्या गलत किया?

+1

क्या आप "संबंध mytable" के बारे में कुछ विवरण प्रदान कर सकते हैं? स्कीमा, क्या यह एक "वास्तविक" तालिका है (या एक दृश्य/फ़ंक्शन), ट्रिगर्स ... –

+0

हां यह एक उचित तालिका है। – sorin

उत्तर

129

हाल ही में अपडेट किया गया PostgreSQL 9+ का पूरा समाधान यहां है। कई महत्वपूर्ण पहलुओं

किसी को भी कम कोड मिल जाए, और अधिमानतः एक है कि सभी मौजूदा डेटाबेस, अतिरिक्त प्रशंसा के लिए इस प्रदर्शन करने में सक्षम है के लिए http://jamie.curle.io/creating-a-read-only-user-in-postgres/ को

CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly'; 
GRANT USAGE ON SCHEMA public to readonly; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; 

-- repeat code below for each database: 

GRANT CONNECT ON DATABASE foo to readonly; 
\c foo 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo" 
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly; 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly; 

धन्यवाद।

+6

क्या इसमें विचार शामिल हैं? –

+1

आप रीडोनली उपयोगकर्ता को डिफ़ॉल्ट रूप से 'अनुदान ऑल' अनुमति क्यों दे रहे हैं? –

9

जोड़ने के लिए

GRANT USAGE ON SCHEMA public to readonly; 

आप शायद बारे में पता नहीं एक एक स्कीमा के लिए अपेक्षित अनुमतियाँ करने के लिए, क्रम स्कीमा में वस्तुओं का उपयोग करने के की जरूरत है कि थे की कोशिश करो।

+0

कुछ अजीब हो रहा है, मैं 'psql' उपयोगकर्ता' के रूप में सर्वर पर इन आदेशों को चलाता हूं और मुझे उचित प्रतिक्रिया मिलती है, 'अनुदान'। फिर भी, जब मैं टेबल पर एसीएल को देखता हूं तो मुझे केवल दो अन्य खाते दिखाई देते हैं, एक डेटाबेस मालिक 'जिराउज़र' और एक अन्य पाठक खाता 'qauser' नाम दिया जाता है। लेकिन मेरा 'पठनीय' वहां दिखाई नहीं देता है। पोस्टग्रेज़ संस्करण 9.1 है और मैंने सर्वर को फिर से शुरू किया है, फिर भी कुछ भी नहीं होता है। – sorin

+2

psql कंसोल में \ du का आउटपुट/आउटपुट क्या था? क्या आप अभी भी यह आउटपुट दे सकते हैं या यह आपके उत्तर में पहले ही तय हो चुका है? – sufleR

+0

मुझे वास्तव में पता नहीं था कि क्या हुआ, क्योंकि आउटपुट सही था (अनुदान)। YEsterday यह काम नहीं किया, लेकिन आज यह फिर से, सभी 3 आदेश चलाने के बाद काम किया। – sorin

-4

यह मेरे लिए काम किया:

चेक वर्तमान भूमिका आप का उपयोग करके में लॉग इन किया: चयन CURRENT_USER, SESSION_USER;

नोट: यह स्कीमा के मालिक से मेल खाना चाहिए।

स्कीमा | नाम | टाइप करें मालिक
-------- + -------- + ------- + ----------

तो मालिक अलग है , तो व्यवस्थापक भूमिका से वर्तमान उपयोगकर्ता भूमिका में सभी अनुदान दें:

'ROLE_OWNER' को 'वर्तमान ROLENAME' में अनुदान दें;

फिर क्वेरी निष्पादित करने का प्रयास करें, यह आउटपुट देगा क्योंकि इसमें अब सभी रिश्तों तक पहुंच है।

+4

मालिक को किसी उपयोगकर्ता को बदलना जिसे रीडोनली कहा जाता है, ठीक से ठीक तरह की तरह लगता है। – Anna

+0

आपके मामले के आधार पर, गलत टेबल मालिक वास्तव में कारण हो सकता है (यह मुझे दुश्मन था)। PostgreSQL में टेबल स्वामित्व को बदलने का सही तरीका: http://stackoverflow.com/a/13535184 – tanius

-6

आप अगले क्वेरी को निष्पादित करना चाहिए: तुम इतनी,

GRANT ALL ON TABLE mytable TO myuser; 

या अगर अपने त्रुटि की दृष्टि में है तो शायद मेज की अनुमति नहीं है अगली क्वेरी निष्पादित करनी चाहिए:

GRANT ALL ON TABLE tbm_grupo TO myuser; 
+4

उपयोगकर्ता को "readonly" कहा जाता है। यह संदिग्ध है कि उपयोगकर्ता को सभी अनुमतियां देना लक्ष्य है। वह सिर्फ एक चयन करना चाहता है। – Anna

संबंधित मुद्दे