पोस्टग्रैक्स्ल में सभी तालिकाओं का चयन करें


जवाबों:


144

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

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

यहाँ लिंक है


मैं जल्द ही अपग्रेड करूंगा, इसलिए यह वास्तव में अच्छी खबर है। धन्यवाद!
एडम मटन

क्या यह सार्वजनिक स्कीमा का उपयोग करने वाले सर्वर पर सभी डेटाबेस को प्रभावित करता है?
kristianp

5
यदि मैं एक नई तालिका बनाता हूं, तो क्या इस उपयोगकर्ता के पास नई बनाई गई तालिका तक पहुंच होगी?
ग्यूसीम

8
@GuiSim नहीं, आपको default privilegesएक स्कीमा पर सेट करना होगा , जहां ytou तालिका बनाएं: postgresql.org/docs/current/static/…
SkyRaT

@kristianp नहीं, PG क्लस्टर के प्रत्येक डेटाबेस का अपना सार्वजनिक स्कीमा है। यह publicआपके द्वारा कनेक्ट किए गए वर्तमान DB के स्कीमा में सभी तालिकाओं (फ़ंक्शन) को प्रभावित करता है।
SkyRaT

11

मेरा (नॉन-वन-लाइनर) समाधान:

#!/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

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


3
यदि आप all_tables के बजाय pg_stat_user_tables का उपयोग करते हैं, तो आपको अपने grep की आवश्यकता नहीं है ... साथ ही, स्वरूपित आउटपुट से छुटकारा पाने के लिए -At-ps को पास करें।
मैग्नस हैगैंडर

1
ध्यान दें कि 9.0 पोस्टग्रेट्स के रूप में, इस उत्तर का दृष्टिकोण इसे कठिन तरीके से कर रहा है। 9.x में, अब हमारे पास "ON ALL" है जो इस अन्य उत्तर में देखा गया है ।
बेसिल बोर्ख

यह वह जगह नहीं है जहाँ टेबल या स्कीमा नामों में अपरकेस अक्षर होते हैं। नीचे एक संशोधित संस्करण जोड़ना
anneb

9

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

  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. यह आपको आवश्यक अनुमतियों को उत्पन्न करने वाले प्रश्नों की एक सूची देने जा रहा है। आउटपुट कॉपी करें, इसे किसी अन्य क्वेरी में पेस्ट करें, और निष्पादित करें।


2

यह वही है जो मैंने इस्तेमाल किया:

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

मुझे लगता है कि एसक्यूएल में फॉर्मेटिंग और कहां-क्लॉस करना ज्यादा स्वाभाविक है।


2

मैंने यह करना समाप्त कर दिया , और यह काम किया:

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

1

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

#!/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
कृपया अंग्रेजी में।
अभी भी ताजा

0

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


0

एडम मटन द्वारा स्क्रिप्ट (वन-लाइनर समाधान) बहुत बढ़िया है जब कई स्कीमा हैं, लेकिन यह काम नहीं करता है जहां स्कीमा के नाम या टेबल के नाम अपरकेस अक्षर या विशेष वर्ण होते हैं।

संशोधित संस्करन:

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.