Ada beberapa persyaratan izin yang sangat tidak intuitif saat menggunakan REASSIGN
.
Saya telah menemukan bahwa ketika akun pengguna super tidak tersedia (seperti dalam kasus RDS atau Cloud SQL), saya harus memberikan peran target ke peran saya saat ini untuk menetapkan kembali atau menghapus objek yang dimiliki dari peran target. Misalnya, jika pengguna aktif saya adalah postsgres
, dan saya mencoba menghapus user_a
:
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
GRANT ROLE
> DROP OWNED BY user_a;
DROP OWNED
Sekarang, menjadi sedikit lebih rumit jika user_a
kebetulan menjadi anggota postgres
, terutama jika kebetulan mewarisi keanggotaan itu melalui beberapa peran lain, sebut saja schema_admin
...
> DROP OWNED BY user_a
ERROR: permission denied to drop objects
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- Alright, let's try to revoke it...
> REVOKE postgres FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
ERROR: role "user_a" is a member of role "postgres"
-- It's still a member through the inherited grant - trying to revoke again doesn't work:
> REVOKE postgres FROM user_a;
WARNING: role "user_a" is not a member of role "postgres"
REVOKE ROLE
-- So you have to identify the role it's inheriting from, and revoke that:
> REVOKE schema_admin FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
GRANT ROLE
-- Now just to be safe, I'll reassign owned objects before actually dropping everything:
> REASSIGN OWNED BY user_a TO postgres;
REASSIGN OWNED
> DROP OWNED BY user_a;
DROP OWNED
> DROP ROLE user_a;
DROP ROLE;
Voila!
Catatan:Ada jawaban lain yang direferensikan secara luas dan efektif di sini:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ yang berfungsi dengan baik, selama Anda dapat membuat dan masuk sebagai pengguna sementara baru. Namun, dalam beberapa konteks, itu adalah masalah tersendiri (dan Anda juga memiliki pembersihan ekstra untuk menangani penghapusan peran sementara itu setelah Anda selesai), jadi saya mencoba menghindarinya di sini.