किसी DB पर उपयोगकर्ता को सभी अनुमतियां दें


206

मैं एक उपयोगकर्ता को एक डेटाबेस पर सभी व्यवस्थापक देने के बिना एक व्यवस्थापक देना चाहूंगा। मैं ऐसा क्यों करना चाहता हूं इसका कारण यह है कि फिलहाल DEV और PROD एक ही क्लस्टर पर अलग-अलग DB हैं, इसलिए मैं नहीं चाहता कि कोई उपयोगकर्ता उत्पादन ऑब्जेक्ट को बदलने में सक्षम हो, लेकिन यह DEV पर ऑब्जेक्ट को बदलने में सक्षम होना चाहिए।

मैंने कोशिश की:

grant ALL on database MY_DB to group MY_GROUP;

लेकिन यह कोई अनुमति नहीं देता है।

फिर मैंने कोशिश की:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

और यह मुझे ऑब्जेक्ट बनाने की अनुमति देता है, लेकिन उस स्कीमा पर ऑब्जेक्ट को क्वेरी करने के लिए नहीं जो अन्य उपयोगकर्ताओं से संबंधित है

मैं MY_SCHEMA पर उपयोगकर्ता को USAGE की अनुमति देकर आगे बढ़ सकता हूं, लेकिन तब यह टेबल पर अनुमति नहीं होने के बारे में शिकायत करेगा ...

इसलिए मुझे लगता है कि मेरा सवाल यह है: क्या किसी उपयोगकर्ता को डीबी पर सभी अनुमतियाँ देने का कोई आसान तरीका है?

मैं PostgreSQL 8.1.23 पर काम कर रहा हूं।

जवाबों:


271

उपयोगकर्ता को डेटाबेस तक पहुंच की आवश्यकता है , जाहिर है:

GRANT CONNECT ON DATABASE my_db TO my_user;

और (कम से कम) स्कीमाUSAGE पर विशेषाधिकार :

GRANT USAGE ON SCHEMA public TO my_user;

या सभी कस्टम स्कीमाओं USAGEपर अनुदान :

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

फिर, सभी तालिकाओं के लिए सभी अनुमतियाँ ( 9.0 या बाद के पोस्टग्रेसेज की आवश्यकता होती है )।
और अनुक्रम (यदि कोई हो) मत भूलना :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

के लिए पुराने संस्करणों आप pgAdmin III के "अनुदान जादूगर" (डिफ़ॉल्ट जीयूआई) इस्तेमाल कर सकते हैं।

कुछ अन्य वस्तुएं हैं, मैनुअलGRANT की पूरी सूची पोस्टग्रैस 12 के रूप में है:

डेटाबेस ऑब्जेक्ट (तालिका, स्तंभ, दृश्य, विदेशी तालिका, अनुक्रम, डेटाबेस, विदेशी-डेटा आवरण, विदेशी सर्वर, फ़ंक्शन, प्रक्रिया, प्रक्रियात्मक भाषा, स्कीमा, या टेबलस्पेस) पर विशेषाधिकार

लेकिन बाकी की जरूरत शायद ही हो। अधिक जानकारी:

वर्तमान संस्करण में अपग्रेड करने पर विचार करें ।


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
सभी विशेषाधिकार प्रदान करना ON DATABASEशक्तिशाली लगता है, लेकिन यह बहुत कुछ नहीं करता है। यह सिर्फ एक शुरुआत है। यह निहित वस्तुओं पर कोई विशेषाधिकार प्रदान नहीं करता है।
एरविन ब्रान्डस्टेट्टर

49

PostgreSQL 9.0+ में आप निम्न कार्य करेंगे:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

यदि आप इसे नए बने संबंधों के लिए भी सक्षम करना चाहते हैं, तो डिफ़ॉल्ट अनुमतियाँ सेट करें:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

हालाँकि, यह देखते हुए कि आप 8.1 का उपयोग करते हैं, आपको इसे स्वयं कोड करना होगा:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

यह सभी संबंधों पर विशेषाधिकारों को निर्धारित करेगा: टेबल, विचार, अनुक्रमित, अनुक्रम, आदि। यदि आप इसे प्रतिबंधित करना चाहते हैं, तो फ़िल्टर करें pg_class.relkind। देखें pg_class डॉक्स जानकारी के लिए।

आपको इस फ़ंक्शन को सुपरयुसर के रूप में और आपके आवेदन की आवश्यकता के अनुसार नियमित रूप से चलाना चाहिए। एक विकल्प यह एक क्रॉन नौकरी में पैकेज करना होगा जो हर दिन या हर घंटे निष्पादित होता है।


हाय पैट्रिक, "ऑल टेबल" 8.1 पर उपलब्ध नहीं है ( postgresql.org/docs/8.1/static/sql-grant.html ) मुझे पता है कि मैं तालिकाओं के माध्यम से लूप कर सकता हूं और व्यक्तिगत रूप से अनुमति दे सकता हूं, लेकिन यह वही है जो मैं कर रहा हूं। बचने की कोशिश कर रहा है। लेकिन आपकी मदद के लिए धन्यवाद
डिएगो

@ डिगो: 8.1 के लिए जोड़ा गया समाधान
पैट्रिक

धन्यवाद पैट्रिक, मैंने आपके जैसे कुछ किया, लेकिन "GRANT ALL" का उपयोग करके समाप्त कर दिया। किसी कारण से यह कुछ भी करने के लिए प्रतीत नहीं होता है। परीक्षा के लिए, मैं भागा: उपयोगकर्ता को स्कीमा परीक्षण पर सभी अनुदान; लेकिन उसके बाद भी उपयोगकर्ता के पास स्कीमा टेस्ट की टेबल से पढ़ने के लिए एक्सेस नहीं है
डिएगो

2
आपको एक स्कीमा पर उपयोग करना चाहिए। फिर उस स्कीमा (टेबल, व्यू, सीक्वेंस, इंडेक्स, इत्यादि) के सभी संबंधों पर आपको अलग-अलग चयन करना होगा, इनसेट, अपडेट, DELETE, TRUNCATE। स्कीम्स नाम स्थान, संबंध हैं, जहां आपका डेटा बैठता है।
पैट्रिक

28

मैंने PostgreSQL 9.4.15 डेटाबेस पर एक भूमिका 'eSumit' जोड़ने के लिए और इस भूमिका को सभी अनुमति प्रदान करने के लिए निम्न कार्य किया:

CREATE ROLE eSumit;

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

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

इसके अलावा pg_table एंट्रीज़ की जाँच करें:

pg_roles से * का चयन करें; यहां छवि विवरण दर्ज करें

डेटाबेस क्वेरी स्नैपशॉट: यहां छवि विवरण दर्ज करें


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