Apakah ada satu-liner yang memberikan izin SELECT ke pengguna baru postgresql?
Sesuatu yang akan mengimplementasikan pseudo-code berikut:
GRANT SELECT ON TABLE * TO my_new_user;
Apakah ada satu-liner yang memberikan izin SELECT ke pengguna baru postgresql?
Sesuatu yang akan mengimplementasikan pseudo-code berikut:
GRANT SELECT ON TABLE * TO my_new_user;
Jawaban:
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 .
default privileges
skema, di mana Anda membuat tabel: postgresql.org/docs/current/static/…
public
untuk DB saat ini yang terhubung dengan Anda.
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.
Ini dapat dilakukan dengan proses dua langkah.
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")
Itu akan memberi Anda daftar pertanyaan yang akan menghasilkan izin yang diperlukan. Salin output, rekatkan ke kueri lain, dan jalankan.
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
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.
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