सवाल Postgresql में सभी तालिकाओं के लिए अनुदान दें


क्या कोई एक लाइनर है जो अनुदान देता है अनुमतियां चुनें ए के लिए नया उपयोगकर्ता PostgreSQL?

ऐसा कुछ जो छद्म कोड को लागू करेगा:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11


मूल




जवाब:


मैंने सोचा कि यह उल्लेख करने में सहायक हो सकता है कि, 9.0 के रूप में, पोस्टग्रेज़ में स्कीमा में सभी तालिकाओं (साथ ही अन्य ऑब्जेक्ट्स) पर विशेषाधिकार प्रदान करने के लिए वाक्यविन्यास होता है:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

यहां बताया गया है सम्बन्ध


131
2018-06-26 14:00



मैं जल्द ही अपग्रेड करूंगा, इसलिए यह वास्तव में अच्छी खबर है। धन्यवाद! - Adam Matan
क्या यह सर्वर पर सभी डेटाबेस को प्रभावित करता है जो सार्वजनिक स्कीमा का उपयोग करते हैं? - kristianp
अगर मैं एक नई टेबल बनाउंगा, तो क्या इस उपयोगकर्ता के पास नव निर्मित तालिका तक पहुंच होगी? - GuiSim
@ गुईसिम नहीं, आपको सेट करना होगा default privileges एक स्कीमा पर, जहां आप टेबल बनाते हैं: postgresql.org/docs/current/static/... - SkyRaT
@ क्रिस्टियनप नहीं, पीजी क्लस्टर में प्रत्येक डेटाबेस की अपनी सार्वजनिक स्कीमा है। यह स्कीमा में सभी तालिकाओं (कार्यों) को प्रभावित करता है public वर्तमान डीबी के लिए आप से जुड़े हुए हैं। - SkyRaT


मेरा (गैर-लाइनर) समाधान:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

विशेषाधिकार प्राप्त उपयोगकर्ता से भागो, यह एक आकर्षण की तरह काम किया।


11
2018-06-01 06:29



यदि आप all_tables के बजाय pg_stat_user_tables का उपयोग करते हैं, तो आपको अपने grep की आवश्यकता नहीं है ... साथ ही, स्वरूपित आउटपुट से छुटकारा पाने के लिए psql को पास करें। - Magnus Hagander
ध्यान दें कि पोस्टग्रेस 9.0 के रूप में, इस उत्तर का दृष्टिकोण इसे कठिन तरीके से कर रहा है। 9 .x में, अब हमारे पास "सभी पर" देखा गया है यह दूसरा जवाब है। - Basil Bourque


यह दो चरणों की प्रक्रिया के साथ किया जा सकता है।

  1. इस क्वेरी को चलाएं:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    प्रतिस्थापन:

    $foo = उपयोगकर्ता नाम जिसके लिए आप अनुमति देना चाहते हैं
    $bar, $baz = स्कीमा जिन्हें आप अनुमति देना चाहते हैं (केवल "सार्वजनिक" हो सकता है)

  2. यह आपको उन प्रश्नों की एक सूची देने जा रहा है जो आवश्यक अनुमतियां उत्पन्न करेंगे। आउटपुट की प्रतिलिपि बनाएँ, इसे किसी अन्य क्वेरी में पेस्ट करें, और निष्पादित करें।


8
2017-08-05 13:25





यही वह है जो मैंने उपयोग किया था:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

मुझे लगता है कि स्वरूपण करना और एसक्यूएल में कहां क्लोज़ करना अधिक स्वाभाविक है ..


2
2017-11-30 00:38





मैं पोस्टग्रेज़ 8.4 के साथ काम कर रहा हूं और उपयोगकर्ता को सभी विशेषाधिकार देने के लिए निम्न कार्य करता हूं:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
2018-04-05 18:04



कृपया अंग्रेजी में। - Linger


इसे ठीक करने का एक तरीका संग्रहित प्रक्रिया लिखना है। दुर्भाग्य से कोई भी "सभी तालिकाओं को सबकुछ प्रदान नहीं करता" आदेश है या नहीं। इस काम को करने के लिए आपको वास्तव में एक प्रक्रिया या कुछ बाहरी खोल स्क्रिप्ट की आवश्यकता है।


0
2017-07-03 18:20





मैं कर रहा हूँ इस, और यह काम किया:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

0