2013-03-20 27 views
174

ho provato a correre semplice comando SQL:Permesso negato per rapporto

select * from site_adzone; 

ed ho ottenuto questo errore

ERROR: permission denied for relation site_adzone 

Quale potrebbe essere il problema?

Ho provato anche a fare la selezione per altri tavoli e ho avuto lo stesso problema. Ho anche provato a fare questo:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom; 

ma ho avuto questa risposta dalla console

WARNING: no privileges were granted for "jerry" 

Avete qualche idea di cosa può essere sbagliato?

+0

io non sono sicuro di come aggiornare le autorizzazioni in modo da poter leggere/scrivere nel DB – bla0009

+1

è necessario concedere i privilegi necessari: http: // www. postgresql.org/docs/current/static/ddl-priv.html e http://www.postgresql.org/docs/current/static/sql-grant.html –

+2

Benvenuti in SO! Per questa domanda, potresti avere più aiuto su dba.stackexchange.com, anche se potresti trovare altrettanti commenti snidi :) –

risposta

219

GRANT sul database non è quello che ti serve. Grant sui tavoli direttamente.

La concessione dei privilegi sul database è utilizzata principalmente per concedere o revocare i privilegi di connessione. Questo ti permette di specificare chi può fare cose nel database se hanno altre autorizzazioni sufficienti.

Si desidera invece:

GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry; 

Questo si prenderà cura di questo problema.

+0

Ho provato questo concedere tutti privilegi sulla tabella site_adzone a jerry; e ottiene questa risposta ERRORE: permesso negato per relazione site_adzone – bla0009

+5

eseguirlo come superutente, come postgres. –

+11

Può essere una scorciatoia in qualche modo? CONCEDERE TUTTI I PRIVILEGI SU TUTTE LE TAVOLE? – Shadur

132

Pubblicazione di Ron E risposta per i privilegi di concessione su tutte le tabelle in quanto potrebbe essere utile per gli altri.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+2

questa è la risposta giusta! l'altro è solo per un permesso per una tabella – stackdave

+7

Potrebbe anche essere necessario eseguire un comando simile per "TUTTE LE SEQUENZE" e "TUTTE LE FUNZIONI". – Pistos

29

Connettersi al database destra prima, quindi eseguire:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+0

grazie alla connessione al database giusto NON avevo intenzione di fare prima! – asgs

+2

connect to right database rende un enorme dufference :) '\ connect databasename;' –

+0

THIS. Sono stato collegato a "postgres" per tutto il tempo. Grazie! –

5

per concedere le autorizzazioni per le tabelle esistenti utilizzano:

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

Per specificare le autorizzazioni predefinite che verranno applicate a le future tabelle utilizzano:

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

ad es.

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

Se si utilizza SERIAL o BIGSERIAL colonne, allora probabilmente si vuole fare lo stesso per SEQUENCES, oppure la vostra INSERT fallirà (Postgres 10's IDENTITY non soffre di questo problema, ed è consigliato nel corso degli SERIAL tipi) , vale a dire

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

Vedi anche la mia risposta a PostgreSQL Permissions for Web App per maggiori dettagli e uno script riutilizzabili.

Rif:

GRANT

ALTER DEFAULT PRIVILEGES

Problemi correlati