Có, điều này có thể làm được.
"superuser" có thể là một superuser
thực tế , postgres
theo mặc định, tôi đổi tên vai trò cho người dùng thuần túy thành usr
, bởi vì user
là một từ dành riêng - không sử dụng nó làm định danh.
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;
Hoặc bạn có thể tạo các vai trò daemon mà không cần đăng nhập để sở hữu các chức năng và giữ các quyền tương ứng trên bảng. Điều đó thậm chí sẽ an toàn hơn.
Nếu bạn đang đi con đường này, bạn sẽ yêu ALTER DEFAULT PRIVILEGES
(được giới thiệu với PostgreSQL 9.0). Thêm chi tiết trong câu trả lời có liên quan này
.
Đọc chương Viết SECURITY DEFINER
Các chức năng một cách an toàn
trong sách hướng dẫn.