Permiso denegado para la relación <table>

12

He ejecutado el siguiente SQL en psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Cuando inicio sesión como bspue intento consultar la userstabla, aparece el error:

permission denied for relation users

Traté de correr:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Pero no ayuda. ¿Qué estoy haciendo mal? ¿Por qué el propietario de la base de datos NO tiene permisos para consultar su propia base de datos?

EDITAR: Actualicé bspua superusuario por ahora, para que pueda continuar trabajando. Cualquier otra orientación apreciada.

si __nombre__ es Ninguno
fuente
¿Qué \dt "users"muestra el resultado de mostrar?
bma
@bma solo se enumera mi acc principal.
si __name__ es None el
Ejecutó los comandos iniciales como qué usuario? ¿Qué obtienes SELECT session_user, current_useren la parte superior de tu guión? ¿Y cuál es tu versión de Postgres?
Erwin Brandstetter
Si estos fueron los comandos exactos que ha ejecutado, entonces todavía está conectado con su 'acc principal'. Entonces se trata de los privilegios que tienes. De lo contrario, vea la excelente respuesta de Erwin. (Voy a admitir que me siento tonta que este mensaje de error no decir qué papel no tiene permiso Por ejemplo, cuando se corre una cadena de funciones con seguridad las DEFINER, es bastante rápido vuelve confuso quién es quién..)
Dezso

Respuestas:

22

DEFAULT PRIVILEGESno no cambiar los permisos para existentes objetos. Son los privilegios predeterminados para los objetos recién creados y solo para el rol particular al que pertenecen. Si no define el rol cuando se ejecuta ALTER DEFAULT PRIVILEGES, el valor predeterminado es el rol actual (al ejecutar la ALTER DEFAULT PRIVILEGESinstrucción).

Además, dado que está utilizando una serialcolumna, que crea un SEQUENCE, también querrá establecer privilegios predeterminados para secuencias.

Ejecute esto en el usuario con el que crea objetos, antes de ejecutar el CREATEcomando:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Si debe usar pgAdmin, una palabra de precaución. Hay un error en la versión actual 1.20 (o anterior) en la pantalla del script SQL de ingeniería inversa para DEFAULT PRIVILEGES. La pantalla ignora al usuario propietario y, por lo tanto, es incorrecta en ciertas situaciones. Informé el error, el asunto está pendiente .

Para los objetos existentes también puede estar interesado en esta forma "por lotes" del GRANTcomando :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Más bajo esta pregunta relacionada sobre SO:

Erwin Brandstetter
fuente
1
El error mencionado aún persiste en pgAdmin4, consulte redmine.postgresql.org/issues/4685 , que se ha marcado como un duplicado de redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
fuente