डेटाबेस में सभी स्कीमाओं पर उपयोग करें?


13

मैं GRANT USAGEकिसी दिए गए डेटाबेस के लिए एक उपयोगकर्ता / भूमिका करना चाहता हूं । डेटाबेस में कई स्कीमा हैं।

मुझे पता है कि वहाँ एक है ON ALL TABLES IN SCHEMA, लेकिन मैं "सभी स्कीमा" चाहता हूं। मैंने कोशिश की GRANT USAGE .. ON DATABASE, लेकिन यह स्पष्ट रूप से गलत है (यह वास्तव में मौजूद नहीं है )।

यह Postgres 9.3 या 9.4 के लिए है, यह एक सर्वर है जो AWS RDS पर है।

जवाबों:


18

आपके पास कम से कम दो विकल्प हैं।

पहले एक छोटी क्वेरी और एक पाठ संपादक का उपयोग करता है। हमें अपनी रुचि के स्कीमा को एकत्र करना होगा:

SELECT nspname
  FROM pg_namespace;

WHEREयदि आप दायरा सीमित करना चाहते हैं तो आप एक खंड जोड़ सकते हैं । आउटपुट को कॉपी करें और इसमें संशोधन करें, ताकि आपको कई GRANT USAGE ON SCHEMA ... TO your_role;कमांड मिलें। फिर psqlउदाहरण के लिए , इसे फ़ीड करें :

psql -f multigrant.sql

इसका एक सामान्य संस्करण एक शेल स्क्रिप्ट हो सकता है जो एकत्र किए गए नामों और कॉल पर लूप करता है psql, विकल्प के GRANTलिए निर्मित कथन पास करता -cहै।

दूसरा समाधान मूल रूप से एक pl / pgsql ब्लॉक में एक ही करता है, एक गतिशील क्वेरी का निर्माण करता है। कोर एक ही है - हमें स्कीमाटा इकट्ठा करना होगा। फिर हम सभी को लूप करते हैं, स्कीमा द्वारा अनुमति स्कीमा प्रदान करते हुए:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

नोट :

  • तालिकाओं, अनुक्रमों, कार्यों और प्रकारों के विपरीत, कोई स्कीमाता के लिए डिफ़ॉल्ट विशेषाधिकार सेट नहीं कर सकता (9.4 के रूप में)। आपको मैन्युअल रूप से किसी भी नए जोड़े गए स्कीमा के लिए यह विशेषाधिकार देना होगा।
  • यहाँ मैं गतिशील क्वेरी का निर्माण करते समय डॉलर के उद्धरण का उपयोग कर रहा हूँ । यह मुझे 'सामान्य' वाक्यविन्यास का उपयोग करने की अनुमति देता है, उदाहरण के लिए एकल उद्धरण को गुणा करने के विपरीत, (इस उदाहरण में मौजूद नहीं)। इस तरह से अधिकांश संपादक अच्छी तरह से बयानों को उजागर करेंगे।
  • यदि आवश्यक हो तो वस्तु का नाम ठीक से उद्धृत करने के लिए मैं प्रारूप विनिर्देशक के format()साथ भी उपयोग करता हूं %I। स्ट्रिंग स्थिरांक और कुछ quote_ident()कॉल के संयोजन के साथ क्वेरी बनाने की तुलना में यह दृष्टिकोण कहीं अधिक पठनीय है ।
  • pg_namespacepg_catalogस्कीमा में पाया जा सकता है । वहां की अन्य वस्तुओं को देखें - वे आपके स्कीमा, टेबल आदि के हर पहलू को संग्रहीत करते हैं।

1
मुझे आश्चर्य है कि अगर आप एक इवेंट ट्रिगर का उपयोग करके नए बनाए गए स्कीमा के लिए डिफ़ॉल्ट विशेषाधिकारों का अनुकरण कर सकते हैं जो स्वचालित रूप grant usageसे नए स्कीमा के लिए चलता है ।
a_horse_with_no_name

@a_horse_with_no_name इसके बारे में सोचते हुए, मुझे वर्तमान में कोई कारण नहीं दिखता कि यह क्यों नहीं किया जा सका।
dezso

0

आप भी उपयोग कर सकते हैं।

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.