Berikan penggunaan / pilih ke satu tabel
Jika Anda hanya memberikan CONNECT ke database, pengguna dapat terhubung tetapi tidak memiliki hak istimewa lainnya. Anda harus memberikan PENGGUNAAN pada ruang nama (skema) dan PILIH pada tabel dan tampilan secara individual seperti:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Beberapa tabel / tampilan (PostgreSQL 9.0+)
Dalam versi terbaru PostgreSQL, Anda dapat memberikan izin pada semua tabel / tampilan / dll dalam skema menggunakan perintah tunggal daripada harus mengetiknya satu per satu:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Ini hanya memengaruhi tabel yang sudah dibuat. Lebih kuat, Anda dapat secara otomatis memiliki peran default yang ditetapkan untuk objek baru di masa depan:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Perhatikan bahwa secara default ini hanya akan mempengaruhi objek (tabel) yang dibuat oleh pengguna yang mengeluarkan perintah ini: meskipun juga dapat ditetapkan pada peran apa pun yang menjadi anggota pengguna yang mengeluarkan. Namun, Anda tidak mengambil hak default untuk semua peran yang menjadi anggota Anda saat membuat objek baru ... jadi masih ada beberapa hal yang perlu dilakukan. Jika Anda mengadopsi pendekatan yang memiliki peran sebagai basis data, dan perubahan skema dilakukan sebagai peran tersebut, maka Anda harus menetapkan hak default untuk peran tersebut. IMHO ini semua agak membingungkan dan Anda mungkin perlu bereksperimen untuk menghasilkan alur kerja fungsional.
Beberapa tabel / tampilan (versi PostgreSQL sebelum 9.0)
Untuk menghindari kesalahan dalam perubahan multi-tabel yang panjang, disarankan untuk menggunakan proses 'otomatis' berikut untuk menghasilkan yang diperlukan GRANT SELECT
untuk setiap tabel / tampilan:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Ini harus menampilkan perintah GRANT yang relevan ke GRANT SELECT pada semua tabel, tampilan, dan urutan di depan umum, untuk cinta salin-tempel. Secara alami, ini hanya akan diterapkan ke tabel yang sudah dibuat.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Tanpa itu, pengguna "read only" tidak bisa memodifikasi tabel yang ada, tetapi bisa membuat tabel baru dalam skema dan menambah / menghapus data dari tabel tersebut.psql mydb
sebaliknya sebagian besar manipulasi ini tidak akan berhasil. Secara pribadi saya membutuhkan banyak waktu untuk mengetahuinya sendiri. Semoga ini bisa membantu seseorang.Perhatikan bahwa PostgreSQL 9.0 (hari ini dalam pengujian beta) akan memiliki cara sederhana untuk melakukan itu :
sumber
Referensi diambil dari blog ini:
Skrip untuk Membuat Pengguna Hanya-Baca:
Tetapkan izin untuk pengguna hanya baca ini:
Tetapkan izin untuk membaca semua tabel baru yang dibuat di masa mendatang
sumber
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
yang juga memungkinkan untuk membaca semua tabel yang dibuat dalam DB yang sama di masa depan.INSERT
s.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
?Inilah cara terbaik yang saya temukan untuk menambahkan pengguna hanya baca (menggunakan PostgreSQL 9.0 atau yang lebih baru):
Kemudian masuk ke semua mesin terkait (master + read-slave / hot-standby, dll.) Dan jalankan:
sumber
Secara default, pengguna baru akan memiliki izin untuk membuat tabel. Jika Anda berencana membuat pengguna hanya-baca, ini mungkin bukan yang Anda inginkan.
Untuk membuat pengguna hanya baca yang benar dengan PostgreSQL 9.0+, jalankan langkah-langkah berikut:
Jika pengguna hanya-baca Anda tidak memiliki izin untuk mendaftar tabel (yaitu
\d
tidak mengembalikan hasil), itu mungkin karena Anda tidak memilikiUSAGE
izin untuk skema.USAGE
adalah izin yang memungkinkan pengguna untuk benar-benar menggunakan izin yang telah mereka tetapkan. Apa gunanya ini? Saya tidak yakin. Memperbaiki:sumber
Saya telah membuat skrip yang mudah untuk itu; pg_grant_read_to_db.sh . Skrip ini memberikan hak istimewa hanya-baca untuk peran tertentu pada semua tabel, tampilan, dan urutan dalam skema database dan menetapkannya sebagai default.
sumber
Saya membaca semua solusi yang mungkin, yang semuanya baik-baik saja, jika Anda ingat untuk terhubung ke database sebelum Anda memberikan hal-hal;) Bagaimanapun juga terima kasih untuk semua solusi lain !!!
buat pengguna psql:
mulai psql cli dan atur kata sandi untuk pengguna yang dibuat:
terhubung ke database target:
berikan semua hak istimewa yang dibutuhkan:
ubah hak standar untuk target db shema publik:
sumber
Jika database Anda dalam skema publik, itu mudah (ini mengasumsikan Anda sudah membuat
readonlyuser
)Jika basis data Anda digunakan
customschema
, jalankan perintah di atas tetapi tambahkan satu perintah lagi:sumber
Cara tidak langsung untuk melakukannya adalah dengan memberikan pilih pada setiap tabel database:
Anda dapat mengotomatiskannya dengan membuat pernyataan hibah dari metadata database.
sumber
sumber
Diambil dari tautan yang diposting sebagai tanggapan terhadap tautan despesz ' .
Postgres 9.x tampaknya memiliki kemampuan untuk melakukan apa yang diminta. Lihat paragraf Obyek Hibah Basis Data:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Di mana dikatakan: "Ada juga opsi untuk memberikan hak istimewa pada semua objek dengan tipe yang sama dalam satu atau lebih skema. Fungsi ini saat ini hanya didukung untuk tabel, sekuens, dan fungsi (tetapi perhatikan bahwa SEMUA TABEL dianggap termasuk tampilan) dan tabel asing). "
Halaman ini juga membahas penggunaan ROLEs dan PRIVILEGE yang disebut "ALL PRIVILEGES".
Juga hadir informasi tentang bagaimana fungsionalitas GRANT dibandingkan dengan standar SQL.
sumber