PostgreSQL में एक समूह भूमिका के लिए db में एक विशिष्ट स्कीमा पर सभी को अनुदान दें


91

PostgreSQL 9.0 का उपयोग करते हुए, मेरे पास "स्टाफ" नामक एक समूह की भूमिका है और किसी विशेष स्कीमा में तालिकाओं पर इस भूमिका को सभी (या निश्चित) विशेषाधिकारों को देना चाहते हैं। निम्नलिखित में से कोई भी काम नहीं करता है

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

"स्टाफ़" के सदस्य अभी भी डेटाबेस में किसी भी तालिका में स्कीमा "फू" या (दूसरे कमांड के मामले में) में व्यक्तिगत टेबल पर चयन या अद्यतन करने में असमर्थ हैं जब तक कि मैं उस विशिष्ट तालिका पर सभी अनुदान नहीं देता

मैं अपने और अपने उपयोगकर्ताओं के जीवन को आसान बना सकता हूं?

अपडेट: serverfault.com पर इसी तरह के सवाल की मदद से यह पता लगाया ।

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;

जवाबों:


120

आपको दिए गए स्कीमा में सभी मौजूदा तालिकाओं के लिए विशेषाधिकार निर्धारित करने के लिए आशुलिपि मिली । मैनुअल स्पष्ट करता है :

(लेकिन ध्यान दें कि ALL TABLESइसमें विचार और विदेशी तालिकाओं को शामिल किया गया है )।

बोल्ड जोर मेरा। serialस्तंभों nextval()को कॉलम डिफ़ॉल्ट के रूप में एक अनुक्रम पर लागू किया जाता है और, मैनुअल को उद्धृत करते हुए :

अनुक्रमों के लिए, यह विशेषाधिकार कार्य currvalऔर nextvalकार्यों के उपयोग की अनुमति देता है ।

इसलिए यदि serialकॉलम हैं, तो आप अनुक्रमों पर भी USAGE(या ALL PRIVILEGES) अनुदान देना चाहेंगे

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

नोट: पोस्टग्रेज 10 में पहचान कॉलम या बाद में अंतर्निहित दृश्यों का उपयोग करते हैं जिन्हें अतिरिक्त विशेषाधिकारों की आवश्यकता नहीं होती है। (उन्नयन serialकॉलम पर विचार करें ।)

नई वस्तुओं के बारे में क्या ?

आप DEFAULT PRIVILEGESउपयोगकर्ताओं या स्कीमा के लिए भी इच्छुक होंगे :

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

यह भविष्य में स्वचालित रूप से बनाई गई वस्तुओं के लिए विशेषाधिकार निर्धारित करता है - लेकिन पहले से मौजूद वस्तुओं के लिए नहीं।

डिफ़ॉल्ट विशेषाधिकार केवल लक्षित उपयोगकर्ता द्वारा बनाई गई वस्तुओं पर लागू होते हैं ( FOR ROLE my_creating_role)। यदि उस खंड को छोड़ दिया जाता है, तो यह वर्तमान उपयोगकर्ता निष्पादित करने के लिए चूक करता है ALTER DEFAULT PRIVILEGES। स्पष्ट होना:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

यह भी ध्यान दें कि pgAdmin III के सभी संस्करणों में एक सूक्ष्म बग है और SQL फलक में डिफ़ॉल्ट विशेषाधिकारों को प्रदर्शित करता है, भले ही वे वर्तमान भूमिका पर लागू न हों। FOR ROLESQL स्क्रिप्ट को कॉपी करते समय क्लॉज को मैन्युअल रूप से समायोजित करना सुनिश्चित करें ।


2
बस इतना है कि आप इरविन को जानते हैं, आपकी सलाह पोस्ट करने के 10 मिनट बाद, मुझे इसकी आवश्यकता थी। इसकी तरह आप जानते थे कि मैं क्या करने जा रहा हूं ... एक नई तालिका बनाएं और पाएं कि यह सही निजी नहीं है। आपका जवाब बचाव में आया।
पंकिश


जब चल रहा ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;है तो यह कैसे पता है कि डेटाबेस? SCHEMA fooविभिन्न डेटाबेस में मौजूद हो सकता है?
J86

2
@ J86: केवल वर्तमान डेटाबेस पर लागू होता है - जहां कमांड निष्पादित होता है।
एरविन ब्रान्डेसटेटर

1
@ErwinBrandstetter क्या मैं भविष्य के तालिकाओं / दृश्यों के लिए app_user (रीड-राइट) तक पहुंच प्रदान कर सकता हूं, बशर्ते कि तालिकाएँ किसी अन्य समर्पित माइग्रेशन_ user द्वारा स्वचालित रूप से बनाई जाएंगी (फ्लाईवे माइग्रेशन ऐप स्टार्टअप पर चलाए जाते हैं)?
lexeme

43

मेरा जवाब ServerFault.com पर इसी के समान है ।

रूढ़िवादी होने के लिए

यदि आप "सभी विशेषाधिकार" देने की तुलना में अधिक रूढ़िवादी होना चाहते हैं, तो आप इन जैसे कुछ और प्रयास करना चाह सकते हैं।

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

publicवहाँ का उपयोग हर नए डेटाबेस / कैटलॉग के लिए बनाए गए डिफ़ॉल्ट स्कीमा के नाम को संदर्भित करता है। यदि आपने स्कीमा बनाया है तो अपने नाम से बदलें।

स्कीम तक पहुंच

किसी भी कार्रवाई के लिए एक स्कीमा का उपयोग करने के लिए, उपयोगकर्ता को "उपयोग" अधिकार प्रदान किया जाना चाहिए। उपयोगकर्ता द्वारा चयन करने, सम्मिलित करने, अद्यतन करने या हटाने से पहले, उपयोगकर्ता को पहले एक स्कीमा के लिए "उपयोग" दिया जाना चाहिए।

Postgres का उपयोग करते समय आप इस आवश्यकता पर ध्यान नहीं देंगे। डिफ़ॉल्ट रूप से हर डेटाबेस में पहले स्कीमा नाम होता है public। और डिफ़ॉल्ट रूप से प्रत्येक उपयोगकर्ता को स्वचालित रूप से उस विशेष स्कीमा के "उपयोग" अधिकार दिए गए हैं। जब अतिरिक्त स्कीमा जोड़ते हैं, तो आपको उपयोग अधिकार स्पष्ट रूप से देना चाहिए।

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Postgres doc से अंश :

स्कीमा के लिए, निर्दिष्ट स्कीमा में निहित वस्तुओं तक पहुंच की अनुमति देता है (यह मानते हुए कि वस्तुओं की अपनी विशेषाधिकार आवश्यकताओं को भी पूरा किया जाता है)। अनिवार्य रूप से यह अनुदानकर्ता को स्कीमा के भीतर वस्तुओं को "देखने" की अनुमति देता है। इस अनुमति के बिना, सिस्टम टेबल्स को क्वेरी करके ऑब्जेक्ट नामों को देखना संभव है। इसके अलावा, इस अनुमति को रद्द करने के बाद, मौजूदा बैकएंड में ऐसे कथन हो सकते हैं, जो पहले इस लुकअप का प्रदर्शन कर चुके हैं, इसलिए ऑब्जेक्ट एक्सेस को रोकने के लिए यह पूरी तरह से सुरक्षित तरीका नहीं है।

अधिक चर्चा के लिए, प्रश्न देखें कि SCHEMA का उपयोग क्या है? । Postgres विशेषज्ञ क्रेग रिंगर द्वारा उत्तर पर विशेष ध्यान दें

मौजूदा वस्तुओं बनाम भविष्य

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


1
ऊपर दिए गए दो अनुदानों के अलावा, एक और अनुदान की आवश्यकता है: SCHEMA जनता पर कुछ US_user_ को अनुदान;
निंग लियू

1
@NingLiu GRANT उपयोग को इंगित करने के लिए बहुत बहुत धन्यवाद, और मुझे यह सिखाने के लिए। मैंने उत्तर में एक खंड जोड़ा।
बेसिल बोर्क

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