Да, това е възможно.
"superuser" може да е действителен superuser
, postgres
по подразбиране. Преименувам ролята за обикновени потребители на usr
, защото user
е запазена дума - не я използвайте като идентификатор.
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;
Или можете да създадете роли на демон без влизане, за да притежавате функциите и да държите съответните права на масата. Това би било още по-сигурно.
Ако тръгнете по този маршрут, ще обикнете ALTER DEFAULT PRIVILEGES
(въведено с PostgreSQL 9.0). Повече подробности в този свързан отговор
.
Прочетете главата Писане на SECURITY DEFINER
Функционира безопасно
в ръководството.