त्रुटि: एक उपयोगकर्ता के रूप में एक चयन का चयन करते समय पोस्टग्रेज पर संबंध टैबलेन के लिए अनुमति से इनकार कर दिया


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

आसानी से उपयोगकर्ता कनेक्ट कर सकते हैं, तालिकाओं को देख सकते हैं लेकिन जब यह एक सरल चयन करने की कोशिश करता है तो यह हो जाता है:

ERROR: permission denied for relation mytable
SQL state: 42501

यह PostgreSQL 9.1 पर हो रहा है

मैंने क्या ग़लत किया था?


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

जवाबों:


162

हाल ही में अपडेट किए गए PostgreSQL 9+ का संपूर्ण समाधान यहां दिया गया है।

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 SELECT 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;

Https://jamie.curle.io/creating-a-read-only-user-in-postgres/ के लिए कई महत्वपूर्ण पहलुओं के लिए धन्यवाद

अगर किसी को कम कोड मिलता है, और अधिमानतः एक है कि सभी मौजूदा डेटाबेस, अतिरिक्त यश के लिए यह प्रदर्शन करने में सक्षम है।


6
क्या इसमें विचार शामिल हैं?
फ्रैंक कॉनरी

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

1
मैंने बिल्कुल वैसा ही दिया जैसा कि अभी भी परिभाषित है, फिर भी सैम त्रुटि
अनीश गोपीनाथ

उपयोग करके दिए गए अधिकारों की पुष्टि कर सकते हैं \ddp। केवल पढ़ने के लिए पहुँच की =r/तरह दिखाना चाहिए granting_user=r/readonly_user
ग्रेग ब्रे

यह प्रश्न से शब्दशः SQL है। मैं यह नहीं देखता कि यह कैसे समाधान प्रदान करता है।
r351574nc3

12

जोड़ने की कोशिश करें

GRANT USAGE ON SCHEMA public to readonly;

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


कुछ अजीब हो रहा है, मैं का उपयोग कर सर्वर पर इन आदेशों को चलाने psqlके रूप में postgresउपयोगकर्ता और मैं एक उचित प्रतिक्रिया मिलता है, GRANT। फिर भी, जब मैं तालिकाओं पर ACL को देखता हूं तो मुझे केवल दो अन्य खाते दिखाई देते हैं, एक डेटाबेस का मालिक jirauserऔर दूसरा आसानी से नाम वाला खाता qauser। लेकिन मेरा readonlyवहाँ दिखाई नहीं देता। Postgres 9.1 संस्करण है और मैंने भी सर्वर को पुनरारंभ किया है, फिर भी कुछ नहीं होता है।
सोरिन

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

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

3
नोट: इस के लिए अपेक्षित प्रतिक्रिया बस 'अनुदान' है। यदि आप 'चेतावनी:' 'जनता' के लिए कोई विशेषाधिकार नहीं देखते हैं तो यह काम नहीं करता है। उपयोगकर्ता आसानी से अपने आप को अतिरिक्त अनुमति नहीं दे सकते। केवल 'GRANT' अनुमतियों वाला उपयोगकर्ता ही ऐसा कर सकता है, ताकि आपको सुपरयुजर के रूप में लॉग इन करना पड़े।
पीटरवर्मोंट

नमस्ते, जब मैं पोस्ट करने के लिए स्कीमा जनता में सभी जगहों पर चयन करने की कोशिश करता हूं; यह जवाब देता है: त्रुटि: संबंध डेटाबेसस्केलग्लॉक के लिए अनुमति से इनकार कर दिया। क्या आप जानते हैं कि मैं क्या गलत कर रहा हूँ? धन्यवाद (यह GAppEngine Posgres9.6 पर सार्वजनिक पते का उपयोग करते हुए और टर्मिनल के माध्यम से एक्सेस करने पर होता है)
माइक

-5

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

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

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

स्कीमा | नाम | प्रकार | स्वामी
-------- + -------- + ------- + ----------

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

'सर्जेंट रोलनम' को 'ROLE_OWNER';

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


5
मालिक को उपयोगकर्ता में बदलना जिसे रीडऑनली कहा जाता है, शायद ही सही फिक्स की तरह लगता है।
अन्ना

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

-6

सुनिश्चित करें कि आपके उपयोगकर्ता की अपनी भूमिका पर विशेषताएँ हैं। उदाहरण के लिए:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

निम्नलिखित कमांड करने के बाद:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

इसने समस्या को ठीक कर दिया।

यहाँ भूमिकाओं और सामान के लिए ट्यूटोरियल देखें: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
नहीं! "चयन" करने के लिए "रीडऑनली" नामक उपयोगकर्ता को सुपरयुसर की भूमिका देना सही फिक्स नहीं है।
अन्ना

@ अन्ना, यहाँ क्या नहीं हो रहा है। यह धागा केवल पढ़ने के लिए पहुँच देने के बारे में नहीं है। यह धागा एक उपयोगकर्ता को किसी अन्य उपयोगकर्ता को केवल-पढ़ने के लिए एक्सेस देने के बारे में है। IMHO, यह सही है। यदि आपका उपयोगकर्ता Superuser नहीं है, तो आप केवल-पढ़ने वाला उपयोगकर्ता नहीं बना सकते। इसमें चलाया जा रहा त्रुटि केवल पढ़ने योग्य उपयोगकर्ता बनाने में सक्षम हैERROR: permission denied for relation mytable
r351574nc3

-7

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

GRANT ALL ON TABLE mytable TO myuser;

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

GRANT ALL ON TABLE tbm_grupo TO myuser;

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

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