pengembangan-web-mp.com

PILIH GRANT ke semua tabel di postgresql

Apakah ada satu-liner yang memberikan izin PILIH ke pengguna bar postgresql?

Sesuatu yang akan mengimplementasikan pseudo-code berikut:

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

Saya pikir mungkin membantu untuk menyebutkan bahwa, pada 9.0, postgres memang memiliki sintaks untuk memberikan hak istimewa pada semua tabel (serta 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 tautan .

153
TimH

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.

12
Adam Matan

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 yang ingin Anda beri 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, tempel ke query lain, dan jalankan.

9
Ben Williams

Saya akhirnya melakukan ini , dan berhasil:

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

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

2
stox

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
1
wilson

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
0
anneb

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.

0
postgresql007