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)
Até agora 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 mais concessões, o usuário tem permissão para 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 que eu fizesse explicitamente GRANT USAGE
no esquema e depois GRANT SELECT
nas tabelas.
Onde está o 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 ele os direitos apropriados.
Estou perdido, e sua ajuda é muito apreciada :)
EDITAR Seguindo o conselho de @daniel-verite, agora revogo tudo imediatamente após criar o banco de dados. O usuário dietrich não tem mais permissão para criar uma tabela. Bom. MAS : Agora, também o proprietário do banco de dados, project2 , não tem permissão para criar uma tabela. Mesmo depois de emitir GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
e GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, recebo um erro ERROR: nenhum esquema foi selecionado para criar em , e quando tento especificamente CREATE TABLE public.WHATEVER ();
, recebo ERROR: permission denied for schema public . O que estou fazendo errado?