आप PostgreSQL में केवल-पढ़ने वाला उपयोगकर्ता कैसे बनाते हैं?


419

मैं PostgreSQL में एक उपयोगकर्ता बनाना चाहता हूं जो केवल एक विशेष डेटाबेस से चयन कर सकता है। MySQL में कमांड होगी:

GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy';

PostgreSQL में कमांड के समतुल्य कमांड या श्रृंखला क्या है?

मैंने कोशिश की...

postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy';
postgres=# GRANT SELECT ON DATABASE mydb TO xxx;

लेकिन ऐसा प्रतीत होता है कि केवल वही चीजें जो आप डेटाबेस पर दे सकते हैं, वे क्रिएट, कनेक्ट, टेम्पररी और टेमप हैं।

जवाबों:


641

एक ही तालिका का उपयोग करें / चयन करें

यदि आप केवल एक डेटाबेस से संबंध प्रदान करते हैं, तो उपयोगकर्ता कनेक्ट कर सकता है, लेकिन कोई अन्य विशेषाधिकार नहीं है। आपको नामस्थान (स्कीमा) पर USAGE देना होगा और व्यक्तिगत रूप से तालिकाओं और विचारों पर चयन करना होगा:

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

एकाधिक तालिकाएँ / दृश्य (पोस्टग्रैसक्यूएल 9.0+)

PostgreSQL के नवीनतम संस्करणों में, आप स्कीमा में सभी तालिकाओं / दृश्यों / आदि पर एक ही आदेश को टाइप करने के बजाय एक-एक करके उन्हें अनुमति दे सकते हैं:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

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

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

ध्यान दें कि यह केवल इस कमांड को जारी करने वाले उपयोगकर्ता द्वारा बनाई गई वस्तुओं (तालिकाओं) को प्रभावित करेगा: हालांकि यह किसी भी भूमिका पर भी सेट किया जा सकता है कि जारी करने वाला उपयोगकर्ता इसका सदस्य है। हालाँकि, आप नई भूमिकाओं को बनाते समय सभी भूमिकाओं के लिए डिफ़ॉल्ट विशेषाधिकारों को नहीं चुनते हैं ... इसलिए अभी भी कुछ गड़बड़ है। यदि आप उस दृष्टिकोण को अपनाते हैं जिसमें एक डेटाबेस की अपनी भूमिका होती है, और स्कीमा परिवर्तन उस मालिक की भूमिका के रूप में किए जाते हैं, तो आपको उस स्वामित्व भूमिका के लिए डिफ़ॉल्ट विशेषाधिकार निर्दिष्ट करना चाहिए। IMHO यह सब थोड़ा भ्रमित करने वाला है और आपको एक कार्यात्मक वर्कफ़्लो के साथ आने के लिए प्रयोग करने की आवश्यकता हो सकती है।

एकाधिक तालिकाएं / दृश्य (9.0 से पहले पोस्टग्रेजक्यूएल संस्करण)

लंबी, बहु-तालिका परिवर्तनों में त्रुटियों से बचने के GRANT SELECTलिए, प्रत्येक व्यक्ति को आवश्यक उत्पन्न करने के लिए निम्नलिखित 'स्वचालित' प्रक्रिया का उपयोग करने की सिफारिश की जाती है :

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

यह कॉपी-एन-पेस्ट प्यार के लिए प्रासंगिक टेबल कमांड को सभी तालिकाओं, विचारों और दृश्यों में सार्वजनिक रूप से चयन करने के लिए आउटपुट करना चाहिए। स्वाभाविक रूप से, यह केवल उन तालिकाओं पर लागू किया जाएगा जो पहले से ही बनाए गए हैं।


22
आपको पोस्ट के शीर्ष पर PG9 से संबंधित अपना संपादन करना चाहिए।
दानिलो बर्गन

5
अच्छा लगा। एक बात मैं जोड़ूंगा कि आपको इस उपयोगकर्ता द्वारा अनुक्रम को पढ़ने की अनुमति देने की आवश्यकता हो सकती है; इसलिए: xxx में सभी सार्वजनिक स्थानों पर चयन करें;
जेजेसी

26
ध्यान दें कि इस उपयोगकर्ता को नए टेबल बनाने में सक्षम होने से रोकने के लिए, मुझे करना पड़ा REVOKE CREATE ON SCHEMA public FROM PUBLIC;। इसके बिना, "केवल पढ़ने वाला" उपयोगकर्ता मौजूदा तालिकाओं को संशोधित नहीं कर सकता था, लेकिन स्कीमा में नई तालिकाएं बना सकता है और उन तालिकाओं से डेटा जोड़ / हटा सकता है।
Ajedi32

3
@ Ajedi32 यह स्वीकृत उत्तर का हिस्सा होना चाहिए! धन्यवाद
Asfand काजी

12
मेरे जैसे नए लोगों के लिए मुझे लगता है कि यह ध्यान देने योग्य है कि आपको कंसोल का उपयोग शुरू करना चाहिए psql mydbअन्यथा इनमें से अधिकांश जोड़तोड़ नहीं करेंगे। इसे व्यक्तिगत रूप से मुझे अपने हिसाब से जानने में काफी समय लगा। आशा है कि यह किसी की मदद करता है।
अनुज

41

ध्यान दें कि PostgreSQL 9.0 (आज बीटा परीक्षण में) ऐसा करने का एक सरल तरीका होगा :

test=> GRANT SELECT ON ALL TABLES IN SCHEMA public TO joeuser;

3
मुझे काम करने के लिए विशिष्ट डेटाबेस में होना था। Postgresql 9.5।
user1158559

8
यह स्कीमा में केवल मौजूदा तालिकाओं के लिए काम करता है। यदि लिखने वाला उपयोगकर्ता बाद में टेबल बनाता है या बदल देता है, तो पढ़ने वाले उपयोगकर्ता की उन तक पहुंच नहीं होगी
14

32

इस ब्लॉग से लिया गया संदर्भ:

स्क्रिप्ट केवल पढ़ने के लिए उपयोगकर्ता बनाएँ:

CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'Test1234' 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';

इसे केवल उपयोगकर्ता को पढ़ने की अनुमति दें:

GRANT CONNECT ON DATABASE YourDatabaseName TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;

6
यह एक बहुत ही अच्छा जवाब है, एक चीज को छोड़कर: ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User; जो भविष्य में एक ही DB में बनाई गई सभी तालिकाओं को पढ़ने की अनुमति देगा।
रावबेकर

2
अनुक्रमों के लिए केवल-पढ़ने वाले उपयोगकर्ता की अनुमति देना असामान्य है। अनुक्रम पढ़ना इसे अद्यतन करता है, और वे आमतौर पर केवल INSERTएस के लिए आवश्यक हैं
jpmc26

पूर्णता के लिए, संभवतः जोड़ें:GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
फेबियन हडादी

@ jpmc26: इसका मतलब यह है कि आप अनुशंसा करते हैं GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User:?
फाबिन हदादी

@FabienHaddadi इसका मतलब यह है कि जब तक आपके पास कुछ सामान्य आवश्यकता नहीं है, मुझे केवल पढ़ने वाले उपयोगकर्ता को अनुक्रमों पर कोई अनुमति देने की आवश्यकता नहीं है।
jpmc26

24

यहाँ सबसे अच्छा तरीका है जो मैंने केवल पढ़ने वाले उपयोगकर्ताओं को जोड़ने के लिए पाया है (PostgreSQL 9.0 या नए का उपयोग करके):

$ sudo -upostgres psql postgres
postgres=# CREATE ROLE readonly WITH LOGIN ENCRYPTED PASSWORD '<USE_A_NICE_STRONG_PASSWORD_PLEASE';
postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

फिर सभी संबंधित मशीनों (मास्टर + रीड-स्लेव) / हॉट-स्टैंडबाय (एस), आदि .. और भागो में लॉग इन करें:

$ echo "hostssl <PUT_DBNAME_HERE> <PUT_READONLY_USERNAME_HERE> 0.0.0.0/0 md5" | sudo tee -a /etc/postgresql/9.2/main/pg_hba.conf
$ sudo service postgresql reload

2
मुझे दृष्टिकोण पसंद है लेकिन मुझे DATABASE [thedatabase] TO [theuser या भूमिका] पर GRANT CONNECT की आवश्यकता है; और स्कीमा या भूमिका पर सार्वजनिक जनता का उपयोग करें;
इयान कोनोर

1
सार्वजनिक स्कीमा अभी भी ऐसे उपयोगकर्ता को टेबल बनाने की अनुमति देता है। इसके अलावा, नई तालिकाओं को कवर नहीं किया गया है, न ही अनुक्रम हैं। दुर्भाग्य से, यह सब इससे थोड़ा अधिक जटिल है। : - / मैं पोस्ट करूँगा कि मैंने जो कुछ किया है उसे एक बार पूरा करने के बाद मैंने उसे समाप्त कर दिया।
JJC

अपनी उपरोक्त स्क्रिप्ट में आप भूमिका को दो बार बनाने की कोशिश कर रहे हैं। मुझे संदेह है कि आप लॉगिन और पासवर्ड सेट करने में सक्षम होने पर "ALTER ROLE ..." का उपयोग करने का इरादा रखते हैं
बोगदान

यदि आपके पास पहले से ही उपयोगकर्ता है, तो रीडोनली भूमिका और अनुदान का चयन करने के बाद, उपयोगकर्ता को नई भूमिका देने की अनुमति देता है: GRANT पढ़ने के लिए <USER>
gonz

18

डिफ़ॉल्ट रूप से नए उपयोगकर्ताओं को टेबल बनाने की अनुमति होगी। यदि आप केवल-पढ़ने वाला उपयोगकर्ता बनाने की योजना बना रहे हैं, तो यह संभवतः वह नहीं है जो आप चाहते हैं।

PostgreSQL 9.0+ वाला एक सच्चा रीड-ओनली उपयोगकर्ता बनाने के लिए, निम्न चरण चलाएँ:

# This will prevent default users from creating tables
REVOKE CREATE ON SCHEMA public FROM public;

# If you want to grant a write user permission to create tables
# note that superusers will always be able to create tables anyway
GRANT CREATE ON SCHEMA public to writeuser;

# Now create the read-only user
CREATE ROLE readonlyuser WITH LOGIN ENCRYPTED PASSWORD 'strongpassword';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;

यदि आपके रीड-ओनली उपयोगकर्ता के पास तालिकाओं को सूचीबद्ध करने की अनुमति नहीं है (अर्थात \dकोई परिणाम नहीं मिलता है), तो यह संभवतः इसलिए है क्योंकि आपके पास USAGEस्कीमा की अनुमति नहीं है । USAGEएक अनुमति है जो उपयोगकर्ताओं को वास्तव में उन अनुमतियों का उपयोग करने की अनुमति देती है जो उन्हें सौंपे गए हैं। इसका क्या मतलब है? मुझे यकीन नहीं है। तै होना:

# You can either grant USAGE to everyone
GRANT USAGE ON SCHEMA public TO public;

# Or grant it just to your read only user
GRANT USAGE ON SCHEMA public TO readonlyuser;

8

मैंने उसके लिए एक सुविधाजनक स्क्रिप्ट बनाई है; pg_grant_read_to_db.sh । यह स्क्रिप्ट डेटाबेस स्कीमा में सभी तालिकाओं, विचारों और अनुक्रमों पर एक निर्दिष्ट भूमिका के लिए केवल-विशेषाधिकारों को अनुदान देती है और उन्हें डिफ़ॉल्ट के रूप में सेट करती है।


4

मैंने सभी संभावित समाधानों को पढ़ा, जो सब ठीक हैं, यदि आप चीजों को देने से पहले डेटाबेस से जुड़ना याद रखते हैं।) वैसे भी अन्य सभी समाधानों के लिए धन्यवाद !!!

user@server:~$ sudo su - postgres

psql उपयोगकर्ता बनाएं:

postgres@server:~$ createuser --interactive 
Enter name of role to add: readonly
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

psql cli शुरू करें और निर्मित उपयोगकर्ता के लिए एक पासवर्ड सेट करें:

postgres@server:~$ psql
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
Type "help" for help.

postgres=# alter user readonly with password 'readonly';
ALTER ROLE

लक्ष्य डेटाबेस से कनेक्ट करें:

postgres=# \c target_database 
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
You are now connected to database "target_database" as user "postgres".

सभी आवश्यक विशेषाधिकार प्रदान करें:

target_database=# GRANT CONNECT ON DATABASE target_database TO readonly;
GRANT

target_database=# GRANT USAGE ON SCHEMA public TO readonly ;
GRANT

target_database=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly ;
GRANT

डीबी सार्वजनिक शमा लक्ष्य के लिए डिफ़ॉल्ट विशेषाधिकार बदल:

target_database=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES

3

यदि आपका डेटाबेस सार्वजनिक स्कीमा में है, तो यह आसान है (यह मानता है कि आपने पहले ही बनाया है readonlyuser)

db=> GRANT SELECT ON ALL TABLES IN SCHEMA public to readonlyuser;
GRANT
db=> GRANT CONNECT ON DATABASE mydatabase to readonlyuser;
GRANT
db=> GRANT SELECT ON ALL SEQUENCES IN SCHEMA public to readonlyuser;
GRANT

यदि आपका डेटाबेस उपयोग कर रहा है customschema, तो ऊपर निष्पादित करें लेकिन एक और कमांड जोड़ें:

db=> ALTER USER readonlyuser SET search_path=customschema, public;
ALTER ROLE

1

ऐसा नहीं करने का सीधा तरीका डेटाबेस के प्रत्येक तालिका पर चयन करना होगा:

postgres=# grant select on db_name.table_name to read_only_user;

आप डेटाबेस मेटाडेटा से अपने अनुदान विवरण उत्पन्न करके इसे स्वचालित कर सकते हैं।



0

Despesz के लिंक के जवाब में पोस्ट किए गए लिंक से लिया गया ।

पोस्टग्रैज 9. एक्स में वह क्षमता है जो वह करने का अनुरोध करता है। डेटाबेस ऑब्जेक्ट के पैराग्राफ पर अनुदान देखें:

http://www.postgresql.org/docs/current/interactive/sql-grant.html

जहां यह कहा गया है: "एक या अधिक स्कीमा के भीतर एक ही प्रकार की सभी वस्तुओं पर विशेषाधिकार देने का विकल्प भी है। यह कार्यक्षमता वर्तमान में केवल तालिकाओं, अनुक्रमों और कार्यों के लिए समर्थित है (लेकिन ध्यान दें कि सभी टैब को विचार शामिल करने के लिए माना जाता है। और विदेशी टेबल)

इस पृष्ठ में ROLE और "PRIVILEGES" नामक एक PRIVILEGE के उपयोग की भी चर्चा है।

साथ ही यह भी जानकारी है कि SQL फंक्शंस की तुलना में GRANT फंक्शनालिटी कैसे होती है।

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