Me pregunto por qué un usuario recién creado puede crear una tabla después de conectarse a una base de datos. Tengo una base de datos 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)
Hasta aquí todo bien. Ahora creo un usuario:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Bueno. Cuando intento conectarme a la base de datos, el usuario no puede hacerlo:
$ 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.
Esto es lo que esperaba. Ahora comienzan las cosas extrañas. Le otorgo al usuario 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)
Y sin más concesiones, el usuario puede crear una tabla:
$ 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)
Hubiera esperado que el usuario no tenga permitido hacer nada antes de hacerlo explícitamente GRANT USAGE
en el esquema y luego GRANT SELECT
en las tablas.
¿Dónde está mi error? ¿Qué estoy haciendo mal? ¿Cómo puedo lograr lo que quiero (que un nuevo usuario no tenga permitido hacer nada antes de otorgarle explícitamente los derechos correspondientes)?
Estoy perdido, y tu ayuda es muy apreciada :)
EDITAR Siguiendo el consejo de @ daniel-verite, ahora revoqué todo inmediatamente después de crear la base de datos. El usuario dietrich ya no puede crear una tabla. Bueno. PERO : Ahora, también el propietario de la base de datos, project2 , no tiene permitido crear una tabla. Incluso después de emitir GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
y GRANT ALL PRIVILEGES ON SCHEMA public TO project2
recibo un error ERROR: no se ha seleccionado ningún esquema para crear , y cuando lo intento específicamente CREATE TABLE public.WHATEVER ();
, obtengo ERROR: permiso denegado para el esquema público . ¿Qué estoy haciendo mal?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. ¿Por qué esto no tuvo ningún efecto?