सवाल Postgresql: डाटाबेस पर सभी प्राइवेट अनुदान क्या करता है?


मैं किसी दिए गए डेटाबेस की सभी तालिकाओं पर सभी विशेषाधिकारों को एक नए पोस्टग्रेस उपयोगकर्ता (स्वामी नहीं) पर देने का प्रयास कर रहा हूं। ऐसा लगता है GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user; ऐसा नहीं करता है। चलने वाले आदेश को सफलतापूर्वक (पोस्टग्रेस उपयोगकर्ता के रूप में) चलाने के बाद, मुझे निम्न_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) किसी उपयोगकर्ता को सभी तालिकाओं पर सभी अनुमतियां देने का उचित तरीका क्या है? (भविष्य में बनाए गए सभी तालिकाओं सहित)


54
2017-11-04 02:45


मूल




जवाब:


आपके सवालों के जवाब आते हैं ऑनलाइन 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 अलग-अलग उन स्कीमा के विशेषाधिकार।


76
2017-11-04 04:28



क्या डेटाबेस में एकाधिक मालिक हो सकते हैं? यदि हां, तो दूसरा मालिक कैसे जोड़ें? - rz.
नहीं, मुझे नहीं लगता कि डेटाबेस में एक से अधिक मालिक हो सकते हैं, आप उन्हें किसी मालिक के सभी लिख सकते हैं - hellomynameisjoel
भूलें कि आपको अनुक्रमों पर समान बनाना है: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user; या आप कोई रिकॉर्ड नहीं डाल सकते हैं।
यहां तक ​​कि यदि यह काम नहीं करता है तो भी कोशिश करें: = अपने सभी लोगों को SCHEMA सार्वजनिक में सभी तालिकाओं पर सभी प्रावधान प्रदान करें; - Kaustubh


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

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

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

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


6
2017-12-17 01:43