ERRORE: authorization negata per la relazione nome-tabulazione su Postgres mentre si prova un SELECT come utente readonly

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly; 

L’utente readonly 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?

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 ALL 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 codice più corto, e preferibilmente uno che è in grado di eseguire questo per tutti i database esistenti, extra kudos.

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 oggetti nello schema.

Questo ha funzionato per me:

Verifica il ruolo corrente con cui hai effettuato l’accesso utilizzando: SELEZIONA CURRENT_USER, SESSION_USER;

Nota : deve corrispondere con il proprietario dello schema.

Schema | Nome | Tipo | Proprietario
——– + ——– + ——- + ———-

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

GRANT ‘ROLE_OWNER’ a ‘CURRENT ROLENAME’;

Quindi prova ad eseguire la query, darà l’output in quanto ha accesso a tutte le relazioni ora.

assicurati che il tuo utente abbia attributi sul 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.

vedi 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

Dovresti eseguire la prossima query:

 GRANT ALL ON TABLE mytable TO myuser; 

O se il tuo errore è in una vista allora forse la tabella non ha il permesso, quindi dovresti eseguire la prossima query:

 GRANT ALL ON TABLE tbm_grupo TO myuser;