Postgresql: DATABASE पर सभी PRIVILEGES क्या करता है?


60

मैं किसी दिए गए डेटाबेस के सभी तालिकाओं पर सभी पोस्टर्स को एक नए उपयोगकर्ता (स्वामी नहीं) को देने की कोशिश कर रहा हूं। ऐसा लगता है कि GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;ऐसा नहीं है। चलाने के बाद कहा कमांड सफलतापूर्वक (उपयोगकर्ता के रूप में पोस्टग्रैट्स), मुझे new_user के रूप में निम्नलिखित मिलता है:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

दो सवाल:

1) ऊपर दी गई कमांड क्या करती है, अगर my_db पर सभी टेबलों पर सभी अनुमतियां नहीं दे रही हैं?

2) उपयोगकर्ता के लिए सभी तालिकाओं पर सभी अनुमतियाँ देने का उचित तरीका क्या है? (भविष्य में बनाई गई सभी तालिकाओं पर)

जवाबों:


80

आपके सवालों के जवाब ऑनलाइन PostgreSQL 8.4 डॉक्स से आते हैं ।

  1. GRANT ALL PRIVILEGES ON DATABASEअनुदान CREATE, CONNECTऔर TEMPORARYएक भूमिका के लिए एक डेटाबेस पर विशेषाधिकार (उपयोगकर्ताओं को ठीक करने के लिए के रूप में भेजा जाता है भूमिकाओं )। उन विशेषाधिकारों में से कोई भी वास्तव में एक तालिका से डेटा पढ़ने के लिए भूमिका की अनुमति नहीं देता है; SELECTउसके लिए मेज पर विशेषाधिकार आवश्यक है।

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

    PostgreSQL 9.0 का परिचय निम्न सिंटैक्स है कि लगभग आप क्या चाहते हैं:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

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


1
क्या एक डेटाबेस में कई मालिक हो सकते हैं? यदि हां, तो किसी अन्य मालिक को कैसे जोड़ा जाए?
आरजे।

नहीं, मुझे नहीं लगता कि एक डेटाबेस में एक से अधिक मालिक हो सकते हैं, आप उन्हें एक मालिक के सभी लेखन दे सकते हैं
hellomynameisjoel

15
यह मत भूलो कि आपको दृश्यों पर समान बनाना है: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;या आप कोई रिकॉर्ड नहीं डाल सकते।

यहां तक ​​कि अगर यह काम नहीं करता है, तो यह कोशिश करें: = SCHEMA में सभी टैब पर सभी PRIVILEGES सार्वजनिक रूप से अपने__र के लिए;
कौस्तुभ

10

डेटाबेस स्वामी के रूप में कार्य करने के लिए कई लॉगिन सेट करना संभव है:

  • स्वामी के रूप में कार्य करने के लिए एक "बोलचाल" भूमिका बनाएँ: create role dbowner nologin
  • अपने डेटाबेस के स्वामी को इसमें बदलें: alter database mydb owner dbowner
  • इस नई भूमिका के लिए अपने सभी लॉगिन प्रदान करें: grant dbowner to user1, user2

अब, यदि उपयोगकर्ता 1 या उपयोगकर्ता 2 लॉगिन करते हैं, तो उन्हें "mydb" पर सभी अनुमतियाँ बिना किसी और अनुदान की आवश्यकता के होती हैं।

हालांकि, मैं इस समाधान पर ध्यान से विचार करूंगा। जब भी स्कीमा अपडेट किया जाता है, तो अतिरिक्त अनुदान बनाने के दर्द से बचने के लिए आपके वेब एप्लिकेशन का उपयोग करना इन लोगों में से एक को लुभाता है, लेकिन आप इस तरह से सुरक्षा का एक बहुत उपयोगी तरीका निकाल रहे हैं। यदि आप वास्तव में एकाधिक "प्रवेश" चाहते हैं, तो उपरोक्त समाधान का उपयोग करें, लेकिन स्कीमा में सभी तालिकाओं पर "सभी विशेषाधिकार प्रदान करें ..." पैटर्न के साथ अपने "सामान्य उपयोग" आवेदन के लिए लॉगिन के लिए ऊपर चिपकाएं।


1
क्रिस कॉगडन, बस एक छोटा सा सुधार: डेटाबेस mydb मालिक को dbowner में बदलें
user876743
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.