2011-06-23 10 views
16

मैं सभी डेटाबेस में सभी तालिकाओं के लिए केवल चुनिंदा विशेषाधिकार के साथ उपयोगकर्ता बनाना चाहता हूं। मैंने सोचा कि मैं डेटाबेस की एक सूची प्राप्त और प्रत्येक डेटाबेस के लिए निम्न आदेश लागू हो सकते हैं कि:Postgresql में सभी डेटाबेस के लिए रीडोनली विशेषाधिकार वाले उपयोगकर्ता को कैसे बनाया जाए?

GRANT select ON DATABASE dbname to user1; 

लेकिन मैं निम्नलिखित त्रुटि मिली:

ERROR: invalid privilege type SELECT for database 

जब मैं लोगों googled grant select आपरेशन करने के लिए सलाह दी सभी टेबल के लिए। लेकिन हमेशा नई टेबल जोड़े जा रहे हैं। तो यह मेरे लिए एक स्वीकार्य समाधान नहीं है। क्या किसी को कोई कामकाज पता है?

+0

@Jonas वास्तव में इस बुनियादी एसक्यूएल है, इसलिए नहीं डीबीए के लिए एक अच्छा फिट - http: //dba.stackexchange।com/faq – Stefano

उत्तर

17

आप केवल स्कीमा स्तर पर डेटाबेस स्तर पर ऐसा नहीं कर सकते।

मान लिया जाये कि आप केवल प्रत्येक डेटाबेस में public स्कीमा का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user; 
+2

आपका बयान यह है कि यह नव निर्मित तालिकाओं पर लागू होगा और विचार गलत है - "सभी तालिकाएं" प्रत्येक मौजूदा मौजूदा तालिका पर अनुदान चयन चलाने के लिए बस छोटा है, और कोई डिफ़ॉल्ट सेट नहीं करता है। नई ऑब्जेक्ट्स के लिए डिफॉल्ट सेट करने के लिए, आपको अल्ट्रा डिफॉल्ट प्राइवेट्स कमांड की आवश्यकता है: http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html (नीचे मेरा उत्तर देखें) – IMSoP

+0

@IMSoP: पॉइंटिंग के लिए धन्यवाद वह बाहर! –

+0

मूल प्रश्न सभी तालिकाओं और सभी डेटाबेस के लिए SELECt के विषय पर था। यह mysql में संभव है लेकिन (मुझे लगता है) पोस्टग्रेज़ में संभव नहीं है। पोस्टग्रेज़ में प्रत्येक को स्वतंत्र रूप से प्रत्येक डेटाबेस के लिए इन अधिकारों को देना होगा। शायद आप इसे स्पष्टीकरण के रूप में जोड़ सकते हैं (या यदि संभव हो तो मुझे सही करें)। – Michael

4

मुझे एहसास है कि आपने पहले ही कहा है कि यह एक स्वीकार्य उत्तर नहीं है, लेकिन यह वैसे भी सही जवाब है।

सुरक्षा निर्दिष्ट करना (अनुदान और REVOKE) तालिका डिजाइन और परीक्षण का हिस्सा है।

तालिका परिभाषाओं, सुरक्षा, परीक्षण, और परीक्षण डेटा से पहले उत्पादन में टेबल को स्थानांतरित न करें संस्करण नियंत्रण के अंतर्गत हैं।

यह कहकर कि, PostgreSQL में डेटाबेस पर कोई चयन अनुमति नहीं है। आप डेटाबेस पर केवल निर्माण, कनेक्ट, या TEMP अनुमतियां प्रदान कर सकते हैं।

आप किसी दिए गए स्कीमा में सभी तालिकाओं पर चयन कर सकते हैं। मुझे नहीं पता कि यह GRANT कथन चलाने के बाद बनाए गए तालिकाओं को कैसे प्रभावित करता है, लेकिन परीक्षण करना काफी आसान है।

PostgreSQL Grant syntax

21

आप 2 काम करने होंगे: पहला, मौजूदा वस्तुओं के लिए उपयोग की अनुमति; और दूसरी बात, अब से बनाई गई नई वस्तुओं के लिए डिफ़ॉल्ट पहुंच सेट करें।

ध्यान दें कि "टैबलेट" तक पहुंच प्रदान करने में विचार शामिल हैं, लेकिन इसमें अनुक्रम शामिल नहीं हैं (जैसे "SERIAL" कॉलम के लिए ऑटो-वृद्धि फ़ंक्शन), इसलिए आप शायद उन लोगों तक पहुंच प्रदान करना चाहेंगे।

नीचे मानते हैं कि आप public स्कीमा में सबकुछ करना चाहते हैं। ALTER DEFAULT PRIVILEGES कथन IN SCHEMA ... खंड को छोड़कर पूरे डेटाबेस पर कार्य कर सकता है; प्रत्येक स्कीमा के लिए GRANT को एक बार चलाया जाना है।

-- Grant access to current tables and views 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
-- Now make sure that's also available on new tables and views by default 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT 
ON TABLES 
TO user1; 

-- Now do the same for sequences 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT, USAGE 
ON SEQUENCES 
TO user1; 

PostgreSQL मैनुअल

+0

विचित्र रूप से पर्याप्त मुझे 'उपयोगकर्ता 1 पर स्कीमा जनता पर अनुदान उपयोग की आवश्यकता है;' साथ ही –

3

Postgres संस्करण 9.0 की तुलना में कम के लिए:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME 
+0

मुझे 'psql -d DBNAME -qAt -c' चयन करना था 'अनुदान' अनुदान ऑन '|| relname ||' उपयोगकर्ता को; ' से pg_statio_all_tables जहां schemaname = 'public' "| psql -d DBNAME' अभी तक – tymik

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