ERRORE: autorizzazione negata per la relazione tablename su Postgres durante il tentativo di SELECT come utente di sola lettura


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

L'utente in sola lettura può connettersi, vedere le tabelle ma quando prova a fare una semplice selezione ottiene:

ERROR: permission denied for relation mytable
SQL state: 42501

Questo sta accadendo su PostgreSQL 9.1

Cosa ho sbagliato?


1
Potete fornire alcuni dettagli sulla "relazione mytable"? Schema, è una tabella "reale" (o una vista / funzione), innesca ...
Igor Romanchenko

Risposte:


162

Ecco la soluzione completa per PostgreSQL 9+, aggiornata di recente.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Grazie a https://jamie.curle.io/creating-a-read-only-user-in-postgres/ per diversi aspetti importanti

Se qualcuno trova un codice più breve, e preferibilmente uno che è in grado di eseguirlo per tutti i database esistenti, complimenti extra.


6
questo include le visualizzazioni?
Frank Conry

9
Perché concedi l' GRANT ALLautorizzazione per impostazione predefinita all'utente di sola lettura?
Slava Fomin II

1
Ho dato esattamente come è stato definito, ancora lo stesso errore
Anish Gopinath

può confermare i diritti concessi utilizzando \ddp. Dovrebbe essere visualizzato =r/come granting_user=r/readonly_userper l'accesso in sola lettura.
Greg Bray,

Questo è SQL verbatim dalla domanda. Non vedo come fornisce una soluzione.
r351574nc3

12

Prova ad aggiungere

GRANT USAGE ON SCHEMA public to readonly;

Probabilmente non sapevi che è necessario disporre delle autorizzazioni necessarie per uno schema, al fine di utilizzare gli oggetti nello schema.


Qualcosa di strano sta accadendo, ho eseguito questi comandi sul server utilizzando psqlcome postgresutente e faccio ottenere una risposta adeguata, GRANT. Tuttavia, quando guardo l'ACL sulle tabelle vedo solo altri due account, uno è il proprietario del database jirausere un altro account di sola lettura denominato qauser. Ma il mio readonlynon appare lì. Postgres è la versione 9.1 e ho anche riavviato il server, ma ancora non succede nulla.
sorin

2
qual è / era l'output di \ du nella console psql? Puoi ancora dare questo output o è già corretto come nella tua risposta?
sufleR

Non so davvero cosa sia successo, poiché l'output era corretto (GRANT). YEsterday non ha funzionato, ma oggi ha funzionato dopo aver eseguito, di nuovo, tutti e 3 i comandi.
sorin

3
Nota: la risposta prevista a questo è semplicemente "GRANT". Se vedi "ATTENZIONE: nessun privilegio è stato concesso per" pubblico "", NON ha funzionato. L'utente in sola lettura non può concedere a se stesso autorizzazioni aggiuntive. Solo un utente con autorizzazioni "GRANT" può farlo, quindi probabilmente dovrai accedere come superutente.
Peter Vermont

Ciao, quando provo a CONCEDERE SELEZIONA SU TUTTE LE TABELLE IN SCHEMA public TO postgres; risponde: ERRORE: permesso negato per il registro di database di relazione. Sai cosa sto facendo di sbagliato? Grazie (succede su GAppEngine Posgres9.6 utilizzando l'indirizzo pubblico e accedendo tramite terminale)
Mike

-5

Questo ha funzionato per me:

Verificare il ruolo corrente a cui si è connessi utilizzando: SELECT CURRENT_USER, SESSION_USER;

Nota : deve corrispondere al proprietario dello schema.

Schema | Nome | Tipo | Proprietario
-------- + -------- + ------- + ----------

Se il proprietario è diverso, concedi tutte le concessioni al ruolo utente corrente dal ruolo di amministratore:

GRANT "ROLE_OWNER" a "CURRENT ROLENAME";

Quindi prova ad eseguire la query, darà l'output poiché ora ha accesso a tutte le relazioni.


5
Cambiare il proprietario in un utente chiamato readonly difficilmente suona come la soluzione giusta.
Anna

A seconda del caso, la causa può effettivamente essere il proprietario di un tavolo sbagliato (era un nemico). Modo corretto di tabella del cambiamento ownershiip in PostgreSQL: vedi stackoverflow.com/a/13535184
tanius

-6

assicurati che il tuo utente abbia attributi nel suo ruolo. per esempio:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

dopo aver eseguito il seguente comando:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

ha risolto il problema.

guarda il tutorial per ruoli e cose qui: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
No! Dare il ruolo di Superuser a un utente chiamato "readonly" per eseguire una "selezione" non è la soluzione corretta.
Anna

@Anna Non è quello che sta succedendo qui. Questo thread non riguarda la concessione dell'accesso in sola lettura. Questo thread riguarda la concessione dell'accesso a un utente per fornire a un altro utente l'accesso in sola lettura. IMHO, questo è corretto. Se il tuo utente non è un Superuser, non puoi creare un utente di sola lettura. L'errore in cui ci si ERROR: permission denied for relation mytable
imbatte è dovuto

-7

Dovresti eseguire la query successiva:

GRANT ALL ON TABLE mytable TO myuser;

O se il tuo errore è in una vista, forse la tabella non ha l'autorizzazione, quindi dovresti eseguire la query successiva:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
L'utente è chiamato "readonly". È dubbio che l'obiettivo sia dare all'utente tutte le autorizzazioni. Vuole solo fare una selezione.
Anna

Questo annulla lo scopo di nominare l'utente "ReadOnly" se stai dando ALTER DROP DELETEEct. A quell'utente ...
JayRizzo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.