Ответы:
Ключевое слово PUBLIC указывает, что привилегии должны быть предоставлены всем ролям, включая те, которые могут быть созданы позже. PUBLIC может рассматриваться как неявно определенная группа, которая всегда включает в себя все роли. Любая конкретная роль будет иметь сумму привилегий, предоставленных непосредственно ей, привилегий, предоставленных любой роли, членом которой она в настоящее время является, и привилегий, предоставленных PUBLIC.
Хотя это правда, это не полная картина. Public также действует как неявная роль, к которой принадлежат другие роли и которая имеет свои собственные разрешения, которые не всегда отражаются и сообщаются, которые наследуются.
По умолчанию он дает разрешение на создание общедоступной схемы. если вы не удалите это, все другие правильные шаги по созданию пользователя только для чтения приводят к тому, что этот пользователь также может создавать новые объекты в общедоступной схеме, а затем из-за владения помещать в них данные. Чтобы предотвратить это
REVOKE ALL ON SCHEMA public FROM PUBLIC;
Точно так же это также дает разрешение на уровне базы данных, чтобы удалить использование
REVOKE ALL ON DATABASE all_database FROM PUBLIC;
Хорошая статья здесь: https://wiki.postgresql.org/images/d/d1/Managing_rights_in_postgresql.pdf