Pertanyaan PILIH GRANT ke semua tabel di postgresql


Apakah ada satu-garis yang memberikan Izin SELECT ke a pengguna baru postgresql?

Sesuatu yang akan menerapkan pseudo-code berikut:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11






Jawaban:


Saya pikir mungkin akan membantu untuk menyebutkan bahwa, pada 9,0, postgres memang memiliki sintaks untuk memberikan hak istimewa pada semua tabel (serta objek lainnya) dalam skema:

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

Ini tautan.


131
2018-06-26 14:00



Saya akan segera meningkatkan, jadi ini benar-benar kabar baik. Terima kasih! - Adam Matan
Apakah ini mempengaruhi semua database di server yang menggunakan skema publik? - kristianp
Jika saya membuat tabel baru, apakah pengguna ini memiliki akses ke tabel yang baru dibuat? - GuiSim
@GuiSim Tidak, Anda harus mengatur default privileges pada skema, di mana Anda membuat tabel: postgresql.org/docs/current/static/… - SkyRaT
@kristianp Tidak, setiap basis data dalam kluster PG memiliki skema publiknya sendiri. Itu mempengaruhi semua tabel (fungsi) dalam skema public untuk DB saat ini Anda terhubung. - SkyRaT


Solusi saya (non-satu-liner):

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

Berlari dari pengguna istimewa, itu berfungsi seperti jimat.


11
2018-06-01 06:29



Jika Anda menggunakan pg_stat_user_tables, bukan all_table, Anda tidak perlu grep ... Juga, berikan -A -t ke psql untuk menghapus output yang diformat. - Magnus Hagander
Perhatikan bahwa pada Postgres 9.0, pendekatan jawaban ini melakukannya dengan cara yang sulit. Di 9.x, kita sekarang memiliki "ON ALL" yang terlihat di jawaban yang lain ini. - Basil Bourque


Ini bisa dilakukan dengan proses dua langkah.

  1. Jalankan query ini:

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

    Pengganti:

    $foo = nama pengguna yang ingin Anda beri izin untuk
    $bar, $baz = skema yang ingin Anda beri izin dalam (boleh jadi hanya "publik")

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


8
2017-08-05 13:25





Ini 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 format dan di mana-klausa di sql ..


2
2017-11-30 00:38





Saya bekerja dengan postgres 8.4 dan memberikan semua hak istimewa kepada pengguna untuk melakukan hal-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

1
2018-04-05 18:04



Tolong gunakan bahasa inggris. - Linger


salah satu cara untuk memperbaikinya adalah dengan menulis prosedur yang tersimpan. sayangnya tidak ada perintah "mengabulkan semuanya ke semua tabel" atau lebih. Anda benar-benar memerlukan prosedur atau skrip shell eksternal mungkin untuk membuat ini bekerja.


0
2017-07-03 18:20





Saya akhirnya melakukan ini, dan itu berhasil:

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

0