Autorizzazione negata per la relazione


331

Ho provato a eseguire il comando sql semplice:

select * from site_adzone;

e ho ricevuto questo errore

ERROR:  permission denied for relation site_adzone

Quale potrebbe essere il problema qui?

Ho anche provato a selezionare altri tavoli e ho riscontrato lo stesso problema. Ho anche provato a fare questo:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

ma ho ricevuto questa risposta dalla console

WARNING:  no privileges were granted for "jerry"

Hai idea di cosa possa essere sbagliato?


Non sono sicuro di come aggiornare le autorizzazioni, quindi posso leggere / scrivere in DB
Boban,


2
Benvenuti in SO! Per questa domanda, potresti ricevere ulteriore aiuto su dba.stackexchange.com, anche se potresti trovare altrettanti commenti malvagi :)
Jared Beck,

10
Mi scusi. Questa è la seconda domanda postgresql molto legata alla programmazione che ho visto stasera chiusa come fuori tema! L'ultimo aveva 67.000 visualizzazioni, questa 30.000 visualizzazioni. Dovremmo avere una clausola di popolarità: qualsiasi domanda non soggettiva con> 15.000 visualizzazioni = sull'argomento.
Theodore R. Smith,

1
Questa domanda non è fuori tema! E ', tuttavia, una duplicazione di stackoverflow.com/questions/13497352/...
Wheaties

Risposte:


391

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

La concessione di privilegi sul database viene principalmente utilizzata per concedere o revocare i privilegi di connessione. Ciò consente di specificare chi può eseguire operazioni nel database se dispongono di altre autorizzazioni sufficienti.

Vuoi invece:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Questo risolverà questo problema.


7
eseguirlo come un superutente, come Postgres.
Chris Travers,

19
Questo può essere un collegamento in qualche modo? CONCESSIONE DI TUTTI I PRIVILEGI SU TUTTE LE TABELLE?
Shadur,

196
@Shadur CONCESSIONE DI TUTTI I PRIVILEGI SU TUTTE LE TABELLE IN SCHEMA pubbliche a jerry;
Ron E

10
@RonE è limitato al database corrente, però?
Shadur,

7
@zmiftah per lo schema necessario> Concedere tutti i privilegi su SCHEMA nameSchema all'utente;
Pierozi,

241

Pubblicare la risposta Ron E 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;

21
Potrebbe anche essere necessario eseguire un comando simile per ALL SEQUENCESe ALL FUNCTIONS.
Pistos,

7
Solo per coloro che si chiedevano: ALL TABLESinclude anche viste, quindi non esiste un ALL VIEWScomando separato :-)
André Gasser

74

Connettiti prima al database giusto , quindi esegui:

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

4
grazie alla connessione al database giusto NON lo stavo facendo prima!
chiede il

15
connettersi al giusto database rende una Dufference ENORME :)\connect databasename;
Denis Matafonov,

3
QUESTO. Sono stato sempre collegato a "Postgres". Grazie!
Andrew G.

2
Sì, la connessione al DB ha fatto la differenza
inostia il

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;

questa risposta mi ha salvato la giornata!
anhtran,

19

Il primo e importante passo è connettersi al proprio db:

psql -d yourDBName

2 passaggi, concedi i privilegi

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

18

Per concedere le autorizzazioni a tutte le tabelle esistenti nello schema utilizzare:

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

Per specificare le autorizzazioni predefinite che verranno applicate alle tabelle future utilizzare:

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

per esempio

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

Se usi SERIALo le BIGSERIALcolonne, probabilmente vorrai fare lo stesso per SEQUENCES, altrimenti falliraiINSERT ( Postgres 10'sIDENTITY non soffre di quel problema ed è raccomandato sui SERIALtipi), cioè

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

Vedi anche la mia risposta alle autorizzazioni PostgreSQL per l'app Web per maggiori dettagli e uno script riutilizzabile.

Rif:

CONCEDERE

PRIVILEGI ALTER DEFAULT


9

Ciò si verifica spesso quando si crea una tabella come postgres dell'utente e quindi si tenta di accedervi come un normale utente. In questo caso è meglio accedere come utente postgres e cambiare la proprietà della tabella con il comando:

alter table <TABLE> owner to <USER>;

5

Assicurati di accedere a psql come proprietario delle tabelle. per scoprire chi possiede i tavoli\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

quindi puoi eseguire le SOVVENZIONI


0

Mentre stai cercando autorizzazioni di selezione, ti suggerirei di concedere solo selezionare piuttosto che tutti i privilegi. Puoi farlo tramite:

GRANT SELECT ON <table> TO <role>;

0

Dovresti:

  1. connettersi al database tramite DBeaver con l'utente postgres
  2. nella scheda di sinistra apri il tuo database
  3. apri la scheda Ruoli / menu a discesa
  4. seleziona il tuo utente
  5. nella scheda a destra premi 'Scheda Permessi'
  6. premere la scheda dello schema
  7. premi tab tab / menu a discesa
  8. seleziona tutte le tabelle
  9. selezionare tutte le caselle di controllo delle autorizzazioni richieste (o premere Concedi tutto)
  10. premere Salva

-3

Ho avuto questo problema una volta. basta cambiare l'utente del database in un superutente e il problema è risolto.

ALTER USER myuser CON SUPERUSER;


In questo modo stai concedendo più premesse del necessario. Superuser darà loro l'autorizzazione ad altre operazioni che potresti non volere che l'utente faccia, come la creazione di altri utenti, database, ecc.
Santi
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.