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.