PILIH GRANT ke semua tabel di postgresql

Jawaban:

145

Saya pikir mungkin membantu untuk menyebutkan bahwa, pada 9.0, postgres memang memiliki sintaks untuk memberikan hak istimewa pada semua tabel (dan juga objek lain) dalam sebuah skema:

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

Inilah tautannya .

TimH
sumber
Saya akan segera memutakhirkan, jadi ini adalah kabar baik. Terima kasih!
Adam Matan
Apakah ini mempengaruhi semua database di server yang menggunakan skema publik?
kristianp
5
Jika saya membuat tabel baru, akankah pengguna ini memiliki akses ke tabel yang baru dibuat?
GuiSim
8
@ GuiSim Tidak, Anda harus mengatur default privilegesskema, di mana Anda membuat tabel: postgresql.org/docs/current/static/…
SkyRaT
@ kristianp Tidak, setiap database di gugus PG memiliki skema publik sendiri. Ini memengaruhi semua tabel (fungsi) dalam skema publicuntuk DB saat ini yang terhubung dengan Anda.
SkyRaT
11

Solusi (non-satu-liner) saya:

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

Jalankan dari pengguna istimewa, itu bekerja seperti pesona.

Adam Matan
sumber
3
Jika Anda menggunakan pg_stat_user_tables alih-alih all_tables, Anda tidak perlu grep ... Juga, meneruskan -A -t ke psql untuk menyingkirkan output yang diformat.
Magnus Hagander
1
Perhatikan bahwa pada Postgres 9.0, pendekatan jawaban ini melakukannya dengan cara yang sulit. Dalam 9.x, kita sekarang memiliki "ON ALL" yang terlihat di jawaban lain ini .
Basil Bourque
ini tidak berfungsi di mana nama tabel atau skema mengandung huruf besar. Menambahkan versi modifikasi di bawah ini
anneb
9

Ini dapat dilakukan dengan proses dua langkah.

  1. Jalankan kueri ini:

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

    Penggantian:

    $foo= nama pengguna tempat Anda ingin memberikan izin
    $bar, $baz= skema tempat Anda ingin memberikan izin (bisa berupa "publik")

  2. Itu akan memberi Anda daftar pertanyaan yang akan menghasilkan izin yang diperlukan. Salin output, rekatkan ke kueri lain, dan jalankan.

Ben Williams
sumber
2

Inilah yang saya gunakan:

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

Saya merasa lebih alami untuk melakukan pemformatan dan di mana-klausa dalam sql ..

stox
sumber
2

Saya akhirnya melakukan ini , dan berhasil:

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

Saya bekerja dengan postgres 8.4 dan untuk memberikan semua hak istimewa kepada pengguna, lakukan hal berikut:

#!/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
Wilson
sumber
1
Tolong gunakan bahasa inggris.
Linger
0

salah satu cara untuk memperbaikinya adalah dengan menulis prosedur tersimpan. sayangnya tidak ada perintah "berikan segalanya untuk semua tabel" atau lebih. Anda benar-benar memerlukan prosedur atau skrip shell eksternal mungkin untuk membuat ini berfungsi.

postgresql007
sumber
0

Skrip (solusi satu baris) oleh Adam Matan sangat bagus ketika ada banyak skema, tetapi tidak berfungsi di mana nama skema atau nama tabel berisi huruf besar atau karakter khusus.

Versi yang dimodifikasi:

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