पोस्टग्रेज में मूल अवधारणा
भूमिकाएं वैश्विक वस्तुएं हैं जो एक डीबी क्लस्टर में सभी डेटाबेस तक पहुंच सकती हैं - आवश्यक विशेषाधिकार दिए गए हैं।
एक क्लस्टर कई डेटाबेस रखता है , जिसमें कई स्कीमा . हैं . विभिन्न डीबी में स्कीमा (यहां तक कि एक ही नाम के साथ) असंबंधित हैं। किसी स्कीमा के लिए विशेषाधिकार देना केवल वर्तमान डीबी (अनुदान के समय वर्तमान डीबी) में इस विशेष स्कीमा पर लागू होता है।
प्रत्येक डेटाबेस एक स्कीमा से शुरू होता है public
डिफ़ॉल्ट रूप से। यह एक परंपरा है, और कई सेटिंग्स इसके साथ शुरू होती हैं। इसके अलावा, स्कीमा public
किसी अन्य की तरह ही एक स्कीमा है।
MySQL से आ रहा है, आप एक एकल स्कीमा public
के साथ शुरू करना चाह सकते हैं , स्कीमा परत को पूरी तरह से प्रभावी ढंग से अनदेखा कर रहा है। मैं नियमित रूप से प्रति डेटाबेस दर्जनों स्कीमा का उपयोग कर रहा हूं।
स्कीमा फ़ाइल सिस्टम में निर्देशिकाओं की तरह थोड़ी (लेकिन पूरी तरह से नहीं) हैं।
एक बार जब आप एक से अधिक स्कीमा का उपयोग कर लेते हैं, तो search_path
को समझना सुनिश्चित करें सेटिंग:
- खोज_पथ पहचानकर्ता संकल्प और "वर्तमान स्कीमा" को कैसे प्रभावित करता है
डिफ़ॉल्ट विशेषाधिकार
GRANT
. पर प्रति दस्तावेज़ीकरण :
पोस्टग्रेएसक्यूएल कुछ प्रकार की वस्तुओं पर डिफ़ॉल्ट विशेषाधिकार देता हैpublic
. public
. को कोई विशेषाधिकार नहीं दिया जाता है टेबल, कॉलम, स्कीमा या टेबलस्पेस पर डिफ़ॉल्ट रूप से। अन्य प्रकारों के लिए, public
. को दिए गए डिफ़ॉल्ट विशेषाधिकार इस प्रकार हैं:CONNECT
और CREATE TEMP TABLE
डेटाबेस के लिए; EXECUTE
कार्यों के लिए विशेषाधिकार; और USAGE
भाषाओं के लिए विशेषाधिकार।
इन सभी डिफ़ॉल्ट को ALTER DEFAULT PRIVILEGES
. के साथ बदला जा सकता है :
- डीबी में एक विशिष्ट स्कीमा पर सभी को पोस्टग्रेएसक्यूएल में एक समूह भूमिका के लिए अनुदान दें
समूह भूमिका
जैसे @Craig ने टिप्पणी की, यह GRANT
के लिए सबसे अच्छा है समूह भूमिका के लिए विशेषाधिकार और फिर उस भूमिका का एक विशिष्ट उपयोगकर्ता सदस्य बनाएं (GRANT
उपयोगकर्ता भूमिका के लिए समूह भूमिका)। इस तरह कुछ कार्यों के लिए आवश्यक विशेषाधिकारों के बंडल को निपटाना और रद्द करना आसान हो जाता है।
लॉगिन के बिना एक समूह भूमिका सिर्फ एक और भूमिका है। इसे उपयोगकर्ता भूमिका में बदलने के लिए एक लॉगिन जोड़ें। अधिक:
- पोस्टग्रेएसक्यूएल ने उपयोगकर्ताओं और समूहों को भूमिकाओं में क्यों मिला दिया?
पूर्वनिर्धारित भूमिकाएं
अपडेट करें: पोस्टग्रेज 14 या बाद में नई पूर्वनिर्धारित भूमिकाएँ जोड़ता है (औपचारिक रूप से "डिफ़ॉल्ट भूमिकाएँ") pg_read_all_data
और pg_write_all_data
निम्नलिखित में से कुछ को सरल बनाने के लिए। देखें:
- डेटाबेस की सभी तालिकाओं तक पहुंच प्रदान करें
नुस्खा
मान लीजिए, हमारे पास एक नया डेटाबेस है mydb
, एक समूह mygrp
, और एक उपयोगकर्ता myusr
...
सुपरयूज़र के रूप में विचाराधीन डेटाबेस से कनेक्ट होने के दौरान (postgres
उदाहरण के लिए):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
"एक उपयोगकर्ता को सभी तालिकाओं के लिए सभी विशेषाधिकार" असाइन करने के लिए जैसा आपने लिखा (मैं अधिक प्रतिबंधात्मक हो सकता हूं):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
भविष्य की वस्तुओं के लिए डिफ़ॉल्ट विशेषाधिकार सेट करने के लिए, हर भूमिका के लिए दौड़ें जो इस स्कीमा में ऑब्जेक्ट बनाता है:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
अब, उपयोगकर्ता को समूह प्रदान करें:
GRANT mygrp TO myusr;
संबंधित उत्तर:
- PostgreSQL - DB उपयोगकर्ता को केवल फ़ंक्शन कॉल करने की अनुमति दी जानी चाहिए
वैकल्पिक (गैर-मानक) सेटिंग
MySQL से आ रहा है, और चूंकि आप डेटाबेस पर विशेषाधिकारों को अलग रखना चाहते हैं, आपको यह गैर-मानक सेटिंग पसंद आ सकती है db_user_namespace
. प्रति दस्तावेज़:
यह पैरामीटर प्रति-डेटाबेस उपयोगकर्ता नाम सक्षम करता है। यह डिफ़ॉल्ट रूप से बंद है।
मैनुअल को ध्यान से पढ़ें। मैं इस सेटिंग का उपयोग नहीं करता। यह उपरोक्त को रद्द नहीं करता है।