Eu estou querendo saber por que um usuário recém-criado tem permissão para criar uma tabela depois de se conectar a um banco de dados. Eu tenho um banco de dados project2_core
:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
Por enquanto, tudo bem. Agora eu crio um usuário:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
OK. Quando tento me conectar ao banco de dados, o usuário não tem permissão para fazer isso:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql: FATAL: permission denied for database "project2_core"
DETAIL: User does not have CONNECT privilege.
Isto é o que eu esperava. Agora as coisas estranhas começam. Eu concedo ao usuário CONNECT
:
postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
| | | | | dietrich=c/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
E sem outras concessões, o usuário pode criar uma tabela:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql (9.2.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
project2_core=> create table adsf ();
CREATE TABLE
project2_core=> \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | adsf | table | dietrich
(1 row)
Eu esperava que o usuário não tivesse permissão para fazer nada antes de eu explicitamente fazer GRANT USAGE
o esquema e depois GRANT SELECT
as tabelas.
Onde está meu erro? O que estou fazendo errado? Como posso conseguir o que quero (que um novo usuário não tenha permissão para fazer nada antes de conceder explicitamente a ela os direitos apropriados.
Estou perdido, e sua ajuda é muito apreciada :)
EDIT Seguindo o conselho de @ daniel-verite, agora revoco tudo imediatamente após a criação do banco de dados. O usuário dietrich não pode mais criar uma tabela. Boa. MAS : Agora, também o proprietário do banco de dados, projeto2 , não tem permissão para criar uma tabela. Mesmo após a emissão GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
e GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, recebo um erro ERRO: nenhum esquema foi selecionado para criação e, quando tento especificamente CREATE TABLE public.WHATEVER ();
, recebo a permissão ERRO: negada para o público do esquema . O que estou fazendo errado?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. por que isso não teve nenhum efeito?