GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Pengguna readonly dapat terhubung, melihat tabel tetapi ketika mencoba melakukan pilihan sederhana ia mendapat:
ERROR: permission denied for relation mytable
SQL state: 42501
Ini terjadi di PostgreSQL 9.1
Apa yang saya lakukan salah?
postgresql
sorin
sumber
sumber
Jawaban:
Berikut adalah solusi lengkap untuk PostgreSQL 9+, diperbarui baru-baru ini.
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly'; GRANT USAGE ON SCHEMA public to readonly; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; -- repeat code below for each database: GRANT CONNECT ON DATABASE foo to readonly; \c foo ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo" GRANT USAGE ON SCHEMA public to readonly; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Terima kasih kepada https://jamie.curle.io/creating-a-read-only-user-in-postgres/ untuk beberapa aspek penting
Jika ada yang menemukan kode yang lebih pendek, dan lebih disukai yang mampu melakukan ini untuk semua database yang ada, pujian ekstra.
sumber
GRANT ALL
izin secara default kepada pengguna hanya-baca?\ddp
. Harus menunjukkan=r/
sepertigranting_user=r/readonly_user
untuk akses hanya baca.Coba tambahkan
GRANT USAGE ON SCHEMA public to readonly;
Anda mungkin tidak menyadari bahwa seseorang harus memiliki izin yang diperlukan untuk skema, untuk menggunakan objek dalam skema.
sumber
psql
sebagaipostgres
pengguna dan saya mendapatkan respons yang tepat ,GRANT
. Namun, ketika saya melihat ACL di tabel, saya hanya melihat dua akun lainnya, satu adalah pemilik basis datajirauser
dan satu lagi akun hanya-baca bernamaqauser
. Tapi sayareadonly
tidak muncul di sana. Postgres adalah versi 9.1 dan saya bahkan me-restart server, tetap tidak ada yang terjadi.Ini berhasil untuk saya:
Periksa peran saat ini Anda masuk dengan menggunakan: SELECT CURRENT_USER, SESSION_USER;
Catatan : Ini harus cocok dengan Pemilik skema.
Skema | Nama | Ketik | Pemilik
-------- + -------- + ------- + ----------
Jika pemiliknya berbeda, berikan semua hibah kepada peran pengguna saat ini dari peran admin dengan:
GRANT 'ROLE_OWNER' menjadi 'CURRENT ROLENAME';
Kemudian coba jalankan kueri, itu akan memberikan output karena memiliki akses ke semua relasi sekarang.
sumber
pastikan pengguna Anda memiliki atribut pada perannya. sebagai contoh:
postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | | {} postgres | Superuser, Create role, Create DB, Replication | {}
setelah melakukan perintah berikut:
postgres=# ALTER ROLE flux WITH Superuser; ALTER ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- flux | Superuser | {} postgres | Superuser, Create role, Create DB, Replication | {}
itu memperbaiki masalah.
lihat tutorial untuk peran dan hal-hal di sini: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
sumber
ERROR: permission denied for relation mytable
Anda harus menjalankan kueri berikutnya:
GRANT ALL ON TABLE mytable TO myuser;
Atau jika kesalahan Anda ada dalam tampilan, maka mungkin tabel tidak memiliki izin, jadi Anda harus menjalankan kueri berikutnya:
GRANT ALL ON TABLE tbm_grupo TO myuser;
sumber
ALTER DROP DELETE
Ect. Untuk pengguna itu ...