Postgresql içindeki tüm tablolara GRANT SELECT


Yanıtlar:


144

9.0'dan itibaren postgres'in bir şemadaki tüm tablolarda (ve diğer nesnelerde) ayrıcalıklar sağlayacak sözdizimine sahip olduğunu söylemenin faydalı olacağını düşündüm:

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

İşte bağlantı .


Yakında yükseltme yapacağım, bu gerçekten iyi bir haber. Teşekkürler!
Adam Matan

Bu, genel şemayı kullanan sunucudaki tüm veritabanlarını etkiler mi?
kristianp

5
Yeni bir tablo oluşturursam, bu kullanıcı yeni oluşturulan tabloya erişebilecek mi?
GuiSim

8
@GuiSim Hayır, default privilegesytou'nun tabloyu oluşturduğu bir şemaya ayarlamanız gerekir : postgresql.org/docs/current/static/…
SkyRaT

@kristianp Hayır, PG kümesindeki her veri tabanının kendi genel şeması vardır. publicBağlı olduğunuz mevcut DB şemadaki tüm tabloları (fonksiyonları) etkiler .
SkyRaT

11

Benim tek astarlı olmayan çözümüm:

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

Ayrıcalıklı kullanıcıdan çalıştırın, bir cazibe gibi çalıştı.


3
All_tables yerine pg_stat_user_tables kullanırsanız, grep'inize ihtiyacınız yok ... Ayrıca, formatlanmış çıktıdan kurtulmak için -A -t komutunu psql'ye iletin.
Magnus Hagander

1
Postgres 9.0'dan itibaren bu cevaplamanın yaklaşımının zorlaştığını unutmayın. 9.x'te, şimdi bu diğer cevapta görülen “ON ALL” (TÜM ON) mesajına sahibiz .
Basil Bourque

bu, tablo veya şema adlarının büyük harf içerdiği durumlarda çalışmaz. Aşağıda değiştirilmiş bir sürüm ekleme
anneb

9

Bu iki aşamalı bir işlemle yapılabilir.

  1. Bu sorguyu çalıştır:

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

    Yedekler:

    $foo= izin vermek istediğiniz kullanıcı adı
    $bar, $baz= izin vermek istediğiniz şemalar (yalnızca "genel" olabilir)

  2. Bu size gerekli izinleri sağlayacak sorguların bir listesini verecektir. Çıktıyı kopyalayın, başka bir sorguya yapıştırın ve yürütün.


2

Bu benim kullandığım şeydi:

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

Sql formatlama ve cümlecik yapmanın daha doğal olduğunu düşünüyorum.


2

Yaptığım sona erdi bu ve işe yaradı:

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

1

Postgres 8.4 ile çalışıyorum ve bir kullanıcıya tüm yetkileri vermek için aşağıdakileri yapıyorum:

#!/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
İngilizce lütfen.
Linger

0

Bunu düzeltmenin bir yolu saklı bir prosedür yazmaktır. maalesef "tüm tablolara her şeyi ver" komutu yoktur. Gerçekten bu işlemi yapmak için bir yordam veya bazı dış kabuk komut dosyası gerekir.


0

Adam Matan'ın (one-liner solution) betiği, birçok şema olduğunda harikadır, ancak şema adlarının veya tablo adlarının büyük harf veya özel karakterler içerdiği durumlarda çalışmaz.

Değiştirilmiş sürüm:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.