Permiso denegado para relación

331

Traté de ejecutar el comando sql simple:

select * from site_adzone;

y recibí este error

ERROR:  permission denied for relation site_adzone

Cual podría ser el problema aquí?

Intenté también seleccionar para otras tablas y obtuve el mismo problema. También intenté hacer esto:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

pero recibí esta respuesta de la consola

WARNING:  no privileges were granted for "jerry"

¿Tienes alguna idea de lo que puede estar mal?

Boban
fuente
No estoy seguro de cómo actualizar los permisos para poder leer / escribir en DB
Boban
1
Debe
2
Bienvenido a SO! Para esta pregunta, puede obtener más ayuda en dba.stackexchange.com, aunque puede encontrar la misma cantidad de comentarios sarcásticos :)
Jared Beck
10
Perdóneme. ¡Esta es la segunda pregunta postgresql muy relacionada con la programación que he visto cerrada como fuera de tema esta noche! La última tuvo 67,000 visitas, esta 30,000 visitas. Deberíamos tener una cláusula de popularidad: cualquier pregunta no subjetiva con> 15,000 visitas = sobre el tema.
Theodore R. Smith
1
¡Esta pregunta no está fuera de tema! Sin embargo, es una duplicación de stackoverflow.com/questions/13497352/…
wheaties

Respuestas:

391

GRANT en la base de datos no es lo que necesita. Conceder en las mesas directamente.

La concesión de privilegios en la base de datos se usa principalmente para otorgar o revocar privilegios de conexión. Esto le permite especificar quién puede hacer cosas en la base de datos si tienen otros permisos suficientes.

Usted quiere en cambio:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Esto se encargará de este problema.

Chris Travers
fuente
77
ejecútelo como superusuario, como postgres.
Chris Travers
19
¿Puede esto ser un atajo de alguna manera? OTORGAR TODOS LOS PRIVILEGIOS EN TODAS LAS TABLAS?
Shadur
196
@Shadur OTORGA TODOS LOS PRIVILEGIOS EN TODAS LAS TABLAS EN SCHEMA public TO jerry;
Ron E
10
@RonE, ¿eso está restringido a la base de datos actual?
Shadur
77
@zmiftah para el esquema que necesita> OTORGAR TODOS LOS PRIVILEGIOS EN EL ESQUEMA nameSchema TO user;
Pierozi
241

Publicar la respuesta de Ron E para otorgar privilegios en todas las tablas ya que podría ser útil para otros.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
hundimiento
fuente
21
También es posible que deba ejecutar un comando similar para ALL SEQUENCESy ALL FUNCTIONS.
Pistos
77
Solo para aquellos que se preguntaban: ALL TABLEStambién incluye vistas, por lo que no hay un ALL VIEWScomando separado :-)
André Gasser
74

Conéctese primero a la base de datos correcta , luego ejecute:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
usuario2757813
fuente
44
¡Gracias conectarme a la base de datos correcta NO estaba haciendo antes!
pregunta el
15
conectarse a la base de datos correcta hace una gran diferencia :)\connect databasename;
Denis Matafonov
3
ESTA. Estuve conectado a "postgres" todo el tiempo. ¡Gracias!
Andrew G.
2
Sí, conectarse a la base de datos marcó la diferencia
inostia
44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;
Klanjabrik
fuente
¡Esta respuesta me salvó el día!
anhtran
19

El primer paso importante es conectarse a su base de datos:

psql -d yourDBName

2 pasos, otorgue privilegios

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;
zond
fuente
18

Para otorgar permisos a todas las tablas existentes en el esquema, use:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Para especificar los permisos predeterminados que se aplicarán a las tablas futuras, use:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

p.ej

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Si usa SERIALo BIGSERIALcolumnas, entonces probablemente querrá hacer lo mismo SEQUENCES, o de lo contrario INSERTfallará ( Postgres 10IDENTITY no sufre ese problema, y ​​se recomienda sobre los SERIALtipos), es decir

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

Consulte también mi respuesta a los permisos de PostgreSQL para la aplicación web para obtener más detalles y un script reutilizable.

Árbitro:

CONCEDER

ALTERAR PRIVILEGIOS POR DEFECTO

isapir
fuente
9

Esto sucede con frecuencia cuando crea una tabla como postgres de usuario y luego intenta acceder a ella como un usuario normal. En este caso, es mejor iniciar sesión como usuario de postgres y cambiar la propiedad de la tabla con el comando:

alter table <TABLE> owner to <USER>;
Bruce
fuente
5

Asegúrese de iniciar sesión en psql como propietario de las tablas. para saber quién es el dueño de las mesas usa\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

entonces puedes ejecutar las SUBVENCIONES

Brian McCall
fuente
0

Como está buscando permisos de selección, le sugiero que otorgue solo privilegios de selección en lugar de todos. Puedes hacer esto:

GRANT SELECT ON <table> TO <role>;
Sergi Ramón
fuente
0

Debieras:

  1. conectarse a la base de datos mediante DBeaver con el usuario postgres
  2. en la pestaña izquierda abra su base de datos
  3. abrir la pestaña / menú desplegable Roles
  4. selecciona tu usuario
  5. en la pestaña derecha presione 'pestaña Permisos'
  6. presione su pestaña de esquema
  7. presione tablas pestaña / menú desplegable
  8. seleccione todas las tablas
  9. seleccione todas las casillas de verificación de permisos requeridos (o presione Otorgar todo)
  10. presione Guardar
happydmitry
fuente
-3

Me enfrenté a este problema una vez. simplemente cambie el usuario de la base de datos a un superusuario y su problema se resolverá.

ALTERAR USUARIO myuser CON SUPERUSUARIO;

Adebayo Ogunmoriyele
fuente
Al hacer esto, está otorgando más permisos de los que necesita. Superuser les dará permiso para otras operaciones que tal vez no desee que ese usuario haga, como crear otros usuarios, bases de datos, etc.
Santi