Katakanlah saya memiliki dua grup basis data Postgresql, "penulis" dan "editor", dan dua pengguna, "maxwell" dan "ernest".
create role authors;
create role editors;
create user maxwell;
create user ernest;
grant authors to editors; --editors can do what authors can do
grant editors to maxwell; --maxwell is an editor
grant authors to ernest; --ernest is an author
Saya ingin menulis fungsi pemain yang mengembalikan daftar peran (terutama milik mereka) yang dimiliki maxwell, kira-kira seperti ini:
create or replace function get_all_roles() returns oid[] ...
Ini harus mengembalikan oids untuk maxwell, penulis, dan editor (tetapi tidak ernest).
Tetapi saya tidak yakin bagaimana melakukannya ketika ada warisan.
sumber
pg_has_role()
mungkin sedikit lebih cepat daripada permintaan rekursif saya, bahkan jika itu tidak masalah. Namun satu hal lagi: ia mengembalikan semua peran untuk supersusers, yang mungkin atau mungkin bukan efek samping yang diterima. Di situlah hasilnya berbeda dari kueri saya.Ini adalah versi sederhana dari jawaban Craig Ringer yang bisa digunakan oleh bukan pengguna super:
pg_roles
pada dasarnya adalah pandangan tentangpg_authid
diakses oleh publik, karena tidak mengungkapkan kata sandi, bertentangan denganpg_authid
. Basisoid
bahkan diekspor ke tampilan. Saat tidak membutuhkan kata sandi, tidak ada gunanya membuat fungsi khusus yang dimiliki pengguna super.sumber
Ini pendapat saya. Ini berfungsi untuk satu pengguna tertentu atau semua pengguna.
sumber
Saya yakin ini akan berhasil
Jika Anda lebih suka mendapatkan nama peran, gantilah yang pertama
oid
denganrolname
.sumber
jika Anda ingin mengetahui semua peran dari peran aktif Anda saat ini:
sumber