TL; DR: Novos usuários podem criar tabelas no public
esquema porque as pessoas reclamaram que era muito difícil quando não podiam.
Se você não gostar dos padrões, provavelmente deverá criar um novo banco de dados de modelos com a configuração inicial que deseja. Por exemplo, você pode:
DROP SCHEMA public;
ou
REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
no seu modelo.
Se você deseja que o public
usuário não tenha direitos em um banco de dados, deve:
REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
para que o public
usuário não possa criar esquemas ou usar tabelas temporárias.
Pessoalmente, se eu estivesse projetando isso, daria aos usuários o TEMP
direito no banco de dados por padrão, mas não CREATE
(esquemas no banco de dados) ou CREATE
(tabelas no public
esquema). Eu reservaria para o proprietário.
São escolhas que foram feitas há muito tempo, e é muito difícil mudá-las agora.
Como é, existem reclamações regulares de que é muito difícil iniciar o PostgreSQL porque você precisa criar uma conta de usuário e, com frequência, também deseja criar um banco de dados. Por que simplesmente não os criamos automaticamente e o padrão é "confiar" como o modo de autenticação para facilitar? Por que o postgres
usuário não possui a senha padrão postgres
? Por que não criamos automaticamente usuários se eles existem no sistema operacional? etc.
Existem alguns problemas de usabilidade genuínos para novos usuários - em particular, a maioria das pessoas não tem idéia do que peer
é a autenticação, ou por que apenas rodar psql
após a instalação do PostgreSQL diz que não há usuário com o nome no qual está conectado.
Também é confuso que pg_hba.conf
seja um arquivo de configuração, mas os usuários são criados no nível SQL. Essa divisão confunde os usuários.
Muitas coisas, no entanto, são compromissos entre padrões seguros e padrões fáceis, onde o projeto nunca fará todo mundo feliz.
revoke create on database [databasename] from [username];
e o banco de dados agora é verdadeiramente somente leitura para [nome de usuário]. Certo? Eu vou voltar a esta resposta novamente quando tenho ler um bom livro Postgres :)