मुझे इस पर एक सभ्य गाइड, ट्यूटोरियल या वीडियो श्रृंखला कहां मिल सकती है?
आपको मैनुअल में सब कुछ मिलेगा । नीचे दिए गए लिंक
दी, मामला मामूली और कभी-कभी भ्रामक नहीं है। यहाँ उपयोग के मामले के लिए एक नुस्खा है:
विधि
मैं इसे कॉन्फ़िगर करना चाहता हूं ताकि केवल hostdb_admin
टेबल बना सकें (और ड्रॉप और बदल सकें); , पढ़ डालने, अद्यतन और डिफ़ॉल्ट रूप से सभी टेबल पर हटा सकते हैं;
और केवल सभी तालिकाओं (और विचारों) को पढ़ सकते हैं।
hostdb_mgr
hostdb_usr
सुपरसुसर के रूप में postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
यदि आप अधिक शक्तिशाली व्यवस्थापक चाहते हैं जो डेटाबेस और भूमिकाएँ भी प्रबंधित कर सकते हैं, तो भूमिका विशेषताएँ CREATEDB
औरCREATEROLE
ऊपर जोड़ें ।
प्रत्येक भूमिका को अगले उच्च स्तर तक पहुँचाएँ, इसलिए सभी स्तर "निचले स्तर" से कम से कम विशेषाधिकारों के सेट को "इनहेरिट" करें (कोडिंग):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
मैं स्कीमा का नामकरण कर रहा हूं schma
( hostdb
जो भ्रमित नहीं होगा)। कोई भी नाम उठाओ। वैकल्पिक रूपschma_admin
से स्कीमा का स्वामी बनाएं :
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
के लिए and drop and alter
नीचे दिए गए नोट।
जैसे-जैसे चीजें और अधिक उन्नत होती जाती हैं, मेरे पास उसी तरह के प्रतिबंध TRIGGERS
, संग्रहीत प्रक्रियाओं VIEWS
और शायद अन्य वस्तुओं को लागू करने के लिए प्रश्न होंगे ।
... (लेकिन ध्यान दें कि ALL TABLES
इसमें विचार और विदेशी तालिकाओं को शामिल किया गया है)।
और अद्यतन दृश्य के लिए :
ध्यान दें कि व्यू पर इन्सर्ट, अपडेट या डिलीट करने वाले यूज़र के पास व्यू पर संबंधित इंसर्ट, अपडेट या डिलीट करने की सुविधा होनी चाहिए। इसके अलावा, दृश्य के मालिक के अंतर्निहित आधार संबंधों पर संबंधित विशेषाधिकार होने चाहिए, लेकिन अद्यतन करने वाले उपयोगकर्ता को अंतर्निहित आधार संबंधों पर किसी भी अनुमति की आवश्यकता नहीं है (देखें
धारा 38.5 )।
ट्रिगर भी खास हैं। आपको TRIGGER
मेज पर विशेषाधिकार की आवश्यकता है , और:
लेकिन हम पहले से ही इस सवाल का दायरा बढ़ा रहे हैं ...
महत्वपूर्ण लेख
स्वामित्व
यदि आप schma_admin
तालिकाओं को छोड़ने और बदलने के लिए (अकेले) अनुमति देना चाहते हैं, तो भूमिका को सभी वस्तुओं को अपना बनाएं । दस्तावेज़ीकरण:
किसी वस्तु को गिराने, या किसी भी तरह से अपनी परिभाषा को बदलने का अधिकार, एक अनुदान योग्य विशेषाधिकार के रूप में नहीं माना जाता है; यह मालिक में अंतर्निहित है, और इसे प्रदान या निरस्त नहीं किया जा सकता है। (हालांकि, वस्तु के मालिक की भूमिका में सदस्यता देने या रद्द करने से एक समान प्रभाव प्राप्त किया जा सकता है; नीचे देखें।) मालिक के पास वस्तु के लिए सभी अनुदान विकल्प भी हैं।
ALTER TABLE some_tbl OWNER TO schma_admin;
याschma_admin
शुरू करने केलिए भूमिका के साथ सभी ऑब्जेक्ट बनाएं, फिर आपको मालिक को स्पष्ट रूप से सेट करने की आवश्यकता नहीं है। यह डिफ़ॉल्ट विशेषाधिकारों को भी सरल करता है, जिन्हें आपको केवल एक भूमिका के लिए निर्धारित करना होता है:
पहले से मौजूद वस्तु
डिफ़ॉल्ट विशेषाधिकार केवल नव निर्मित वस्तुओं के लिए लागू होते हैं और केवल उस विशेष भूमिका के लिए जिनके साथ वे बनाए जाते हैं। आप मौजूदा वस्तुओं के लिए भी अनुमतियाँ अनुकूलित करना चाहेंगे :
यदि आप एक ऐसी भूमिका के साथ ऑब्जेक्ट बनाते हैं जो DEFAULT PRIVILEGES
सेट नहीं होती है, तो सुपरयुसर की तरह postgres
। के स्वामित्व पुनः सौंपने schma_admin
और मैन्युअल रूप से विशेषाधिकार सेट - या सेट DEFAULT PRIVILEGES
के लिए postgres
के रूप में अच्छी तरह से: (जबकि सही डीबी से जुड़ा!)
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
डिफ़ॉल्ट विशेषाधिकार
आपको ALTER DEFAULT PRIVILEGES
कमांड का एक महत्वपूर्ण पहलू याद आ रहा था। यह वर्तमान भूमिका पर लागू होता है जब तक कि अन्यथा निर्दिष्ट न हो:
डिफ़ॉल्ट विशेषाधिकार केवल वर्तमान डेटाबेस पर लागू होते हैं। तो आप डीबी क्लस्टर में अन्य डेटाबेस के साथ गड़बड़ नहीं है। दस्तावेज़ीकरण:
वर्तमान डेटाबेस में बनाई गई सभी वस्तुओं के लिए
आप कर सकते हैं भी के लिए डिफ़ॉल्ट विशेषाधिकार सेट करना चाहते हैं FUNCTIONS
और TYPES
(न केवल TABLES
और SEQUENCES
), लेकिन उन की जरूरत नहीं हो सकती है।
के लिए डिफ़ॉल्ट विशेषाधिकार PUBLIC
डिफ़ॉल्ट विशेषाधिकार विशेष रूप से PUBLIC
अल्पविकसित और कुछ से कम करके आंका जाता है। दस्तावेज़ीकरण:
PostgreSQL वस्तुओं के कुछ प्रकारों पर डिफ़ॉल्ट विशेषाधिकार प्रदान करता है
PUBLIC
। तालिका, कॉलम, स्कीमा या टेबलस्पेस पर डिफ़ॉल्ट रूप से कोई विशेषाधिकार प्रदान नहीं किए जाते हैं PUBLIC
। अन्य प्रकारों के लिए, दिए गए डिफ़ॉल्ट विशेषाधिकार PUBLIC
इस प्रकार हैं: CONNECT
और CREATE TEMP TABLE
डेटाबेस के लिए; EXECUTE
कार्यों के लिए विशेषाधिकार; और USAGE
भाषाओं के लिए विशेषाधिकार।
बोल्ड जोर मेरा। आमतौर पर ऊपर दिया गया एक कमांड सब कुछ कवर करने के लिए पर्याप्त है:
REVOKE ALL ON DATABASE hostdb FROM public;
विशेष रूप से, PUBLIC
नए स्कीमा के लिए कोई डिफ़ॉल्ट विशेषाधिकार प्रदान नहीं किए जाते हैं । यह भ्रामक हो सकता है कि "सार्वजनिक" नाम का डिफ़ॉल्ट स्कीमा ALL
विशेषाधिकारों के लिए शुरू होता है PUBLIC
। नव निर्मित डेटाबेस के साथ शुरुआत को आसान बनाने के लिए यह सिर्फ एक सुविधा है। यह किसी भी तरह से अन्य स्कीमा को प्रभावित नहीं करता है। आप टेम्पलेट डेटाबेस में इन विशेषाधिकारों को रद्द कर सकते हैंtemplate1
, फिर इस क्लस्टर में सभी नए बनाए गए डेटाबेस उनके बिना शुरू होते हैं:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
फ़ायदा TEMP
जब से हम पर सभी विशेषाधिकार रद्द hostdb
से PUBLIC
, नियमित रूप से उन अस्थायी तालिकाओं का निर्माण नहीं जब तक कि हम स्पष्ट रूप से इसे अनुमति दे सकते हैं। आप इसे जोड़ना चाहते हैं या नहीं कर सकते हैं:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
सेट करने के लिए मत भूलना search_path
। यदि आपको क्लस्टर में केवल एक डेटाबेस मिला है तो आप केवल वैश्विक डिफ़ॉल्ट सेट कर सकते हैं postgresql.conf
। अधिक (अधिक संभावना) इसे डेटाबेस की संपत्ति के रूप में, या केवल शामिल भूमिकाओं या दोनों के संयोजन के लिए सेट करें। विवरण:
आप के लिए यह सेट कर सकते हैं schma, public
यदि आप के रूप में अच्छी, या यहाँ तक कि (कम संभावना है) सार्वजनिक स्कीमा का उपयोग $user, schma, public
...
डिफ़ॉल्ट स्कीमा "सार्वजनिक" का उपयोग करने के लिए एक विकल्प होगा जो search_path
कि डिफ़ॉल्ट सेटिंग्स के साथ काम करना चाहिए जब तक कि आपने इसे नहीं बदला। PUBLIC
इस मामले में विशेषाधिकारों को रद्द करना याद रखें ।
सम्बंधित
public
छद्म के साथ है । इसे एक भूमिका के रूप में माना जा सकता है कि हर दूसरी भूमिका (उपयोगकर्ता, समूह - ये सभी समान हैं) का एक सदस्य है। उदाहरण के लिए, इससे विशेषाधिकार हटाने की कोशिश करेंREVOKE CREATE ON SCHEMA hostdb FROM public
। डेटाबेस स्तर पर अधिकारों को रद्द करना, जैसा कि आपने किया था, केवल कुछ डेटाबेस-स्तर की अनुमतियों को अक्षम करता है, स्कीमा या तालिकाओं पर कोई प्रभाव नहीं पड़ता है।