Bagaimana cara memberikan hak istimewa drop table / fungsi ke peran di PostgreSQL?

10

Saya ingin memberikan drophak istimewa pada semua tabel dan fungsi (tidak hanya yang dimiliki oleh pengguna) dalam skema tertentu dari database tertentu untuk peran tertentu. Namun, GRANT ALL PRIVILEGESitu tidak cukup dan saya tidak menemukan cara melakukannya tanpa membuat peran sebagai superuser - superuser memiliki hak atas database lain di server yang sama, yang bukan yang saya inginkan. Saya tidak akan keberatan hak superuser terbatas pada database tertentu, tapi saya tidak yakin bagaimana melakukannya.

Kode saya:

CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;

GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;

administratoradalah grup myDBadministrator basis data, _administratoradalah peran yang paling kuat yang dapat diakses oleh aplikasi klien saya.

Apa yang saya lewatkan atau lakukan salah?

Pavel V.
sumber

Jawaban:

11

Hanya pemilik (dan pengguna super) yang dapat menjatuhkan benda. Per dokumentasi:

Hak untuk menjatuhkan objek, atau mengubah definisi dengan cara apa pun, tidak diperlakukan sebagai hak istimewa yang dapat diberikan; itu melekat pada pemilik, dan tidak dapat diberikan atau dicabut. (Namun, efek serupa dapat diperoleh dengan memberikan atau mencabut keanggotaan dalam peran yang memiliki objek; lihat di bawah.) Pemilik secara implisit juga memiliki semua opsi hibah untuk objek tersebut.

Jadi, buat administrator sendiri objek yang harus dijatuhkan pengguna.

ALTER FUNCTION foo() OWNER TO administrator;
ALTER TABLE foo      OWNER TO administrator;

Dan Anda ingat untuk benar-benar memberikan keanggotaan grup, bukan?

GRANT administrator TO _administrator;
Erwin Brandstetter
sumber