PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana Anda membuat pengguna hanya-baca di PostgreSQL?

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 USAGE pada ruang nama (skema) dan SELECT pada tabel dan tampilan satu per satu 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+)

Di PostgreSQL versi terbaru, Anda dapat memberikan izin pada semua tabel/tampilan/dll dalam skema menggunakan satu perintah daripada harus mengetiknya satu per satu:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Ini hanya mempengaruhi tabel yang telah dibuat. Lebih hebatnya lagi, Anda dapat secara otomatis menetapkan peran default ke objek baru di masa mendatang:

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

Perhatikan bahwa secara default ini hanya akan memengaruhi objek (tabel) yang dibuat oleh pengguna yang mengeluarkan perintah ini:meskipun perintah ini juga dapat diatur pada peran apa pun yang menjadi anggota pengguna penerbit. Namun, Anda tidak mengambil hak istimewa default untuk semua peran yang Anda ikuti saat membuat objek baru... jadi masih ada beberapa masalah. Jika Anda mengadopsi pendekatan bahwa database memiliki peran pemilik, dan perubahan skema dilakukan sebagai peran pemilik, maka Anda harus menetapkan hak default untuk memiliki peran tersebut. IMHO ini semua agak membingungkan dan Anda mungkin perlu bereksperimen untuk menghasilkan alur kerja yang 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 GRANT SELECT yang diperlukan ke 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 akan menampilkan perintah GRANT yang relevan ke GRANT SELECT pada semua tabel, tampilan, dan urutan di depan umum, untuk cinta salin-n-tempel. Secara alami, ini hanya akan diterapkan pada tabel yang telah dibuat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbarui Banyak Kolom di PostgreSQL

  2. Cara Mendapatkan Tanggal dan Waktu Saat Ini dengan Offset Zona Waktu di PostgreSQL

  3. Batas kinerja solusi replikasi logis

  4. Menggabungkan pernyataan INSERT dalam CTE yang memodifikasi data dengan ekspresi CASE

  5. Kunci penasihat atau SEKARANG untuk menghindari menunggu baris yang terkunci?