Postgresql: apa yang DIBERIKAN GRANT SEMUA HAK ISTIMEWA PADA DATABASE?

60

Saya mencoba untuk memberikan semua hak istimewa pada semua tabel dari database yang diberikan kepada pengguna postgres baru (bukan pemilik). Tampaknya GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;tidak melakukan itu. Setelah menjalankan perintah tersebut dengan sukses (sebagai pengguna postgres), saya mendapatkan yang berikut ini sebagai new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Dua pertanyaan:

1) Apa yang dilakukan oleh perintah di atas, jika tidak memberikan semua izin pada semua tabel di my_db?

2) Apa cara yang tepat untuk memberikan semua izin pada semua tabel kepada pengguna? (termasuk semua tabel yang dibuat di masa depan)

rz.
sumber

Jawaban:

80

Jawaban atas pertanyaan Anda datang dari dokumen PostgreSQL 8.4 online .

  1. GRANT ALL PRIVILEGES ON DATABASEhibah CREATE, CONNECTdan TEMPORARYhak istimewa pada database untuk peran (pengguna benar disebut sebagai peran ). Tidak satu pun dari hak-hak tersebut yang benar-benar mengizinkan peran untuk membaca data dari tabel; SELECThak istimewa di atas meja diperlukan untuk itu.

  2. Saya tidak yakin ada cara "tepat" untuk memberikan semua hak istimewa di semua tabel ke peran. Cara terbaik untuk memastikan peran yang diberikan memiliki semua hak istimewa di atas meja adalah memastikan bahwa peran tersebut memiliki meja. Secara default, setiap objek yang baru dibuat dimiliki oleh peran yang membuatnya, jadi jika Anda ingin peran memiliki semua hak istimewa di atas meja, gunakan peran itu untuk membuatnya.

    PostgreSQL 9.0 memperkenalkan sintaks berikut yang hampir Anda inginkan:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Masalahnya adalah jika Anda membuat tabel di skema di luar skema "publik" default, ini GRANTtidak akan berlaku untuk mereka. Jika Anda menggunakan skema non-publik, Anda harus memiliki GRANThak istimewa untuk skema tersebut secara terpisah.

Steven Monday
sumber
1
dapatkah suatu basis data memiliki banyak pemilik? jika demikian, bagaimana cara menambahkan pemilik lain?
rz.
tidak, saya tidak berpikir database dapat memiliki lebih dari satu pemilik, Anda dapat memberi mereka semua tulisan pemilik
hellomynameisjoel
15
jangan lupa Anda harus membuat yang sama pada urutan: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;atau Anda tidak dapat memasukkan catatan apa pun.
Bahkan jika itu tidak berhasil coba ini: = PEMBERI SEMUA HAK ISTIMEWA DI SEMUA TABEL DI SCHEMA publik KE your_user;
Kaustubh
10

Dimungkinkan untuk mengatur beberapa login untuk bertindak sebagai pemilik basis data:

  • Buat peran "nologin" untuk bertindak sebagai pemilik: create role dbowner nologin
  • Ubah pemilik database Anda menjadi ini: alter database mydb owner dbowner
  • Berikan semua login Anda ke peran baru ini: grant dbowner to user1, user2

Sekarang, jika user1 atau user2 masuk, mereka memiliki semua izin di "mydb" tanpa ada hibah lebih lanjut yang diperlukan.

Namun, saya akan mempertimbangkan solusi ini dengan hati-hati. Sangat menggoda untuk membuat aplikasi web Anda menggunakan salah satu login ini untuk menghindari kesulitan membuat hibah tambahan setiap kali skema diperbarui, tetapi Anda menghapus bentuk perlindungan yang sangat berguna dengan cara ini. Gunakan solusi di atas jika Anda benar-benar ingin beberapa "admin", tetapi tetap dengan pola "beri semua hak istimewa pada semua tabel dalam skema ..." di atas untuk login untuk aplikasi "penggunaan normal" Anda.

Chris Cogdon
sumber
1
Chris Cogdon, hanya perbaikan kecil: ubah pemilik mydb database ke dbowner
user876743