Ya, ini bisa dilakukan.
"superuser" bisa menjadi superuser
yang sebenarnya , postgres
secara default. Saya mengganti nama peran untuk pengguna biasa menjadi usr
, karena user
adalah kata yang dicadangkan - jangan gunakan itu sebagai pengenal.
CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser; -- poweruser can do everything usr can.
CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;
CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;
REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;
REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;
CREATE FUNCTION
...
SECURITY DEFINER;
REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;
Atau Anda bisa membuat peran daemon tanpa login untuk memiliki fungsi dan memegang hak masing-masing di atas meja. Itu akan lebih aman.
Jika Anda mengikuti rute ini, Anda akan cinta ALTER DEFAULT PRIVILEGES
(diperkenalkan dengan PostgreSQL 9.0). Detail lebih lanjut dalam jawaban terkait ini
.
Baca bab Menulis SECURITY DEFINER
Berfungsi dengan Aman
dalam manual.