Postgresql: cosa concede a TUTTI I PRIVILEGI SUL DATABASE?


60

Sto cercando di concedere tutti i privilegi su tutte le tabelle di un determinato database a un nuovo utente di Postgres (non il proprietario). Sembra che GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;non lo faccia. Dopo aver eseguito il comando con successo (come utente postgres), ottengo quanto segue come new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Due domande:

1) Che cosa fa il comando sopra, quindi, se non concedere tutte le autorizzazioni su tutte le tabelle su my_db?

2) Qual è il modo corretto di concedere tutte le autorizzazioni su tutte le tabelle a un utente? (incluso su tutte le tabelle create in futuro)

Risposte:


80

Le risposte alle tue domande provengono dai documenti PostgreSQL 8.4 online .

  1. GRANT ALL PRIVILEGES ON DATABASEconcede il CREATE, CONNECT, e TEMPORARYprivilegi su un database per un ruolo (gli utenti sono correttamente indicati come i ruoli ). Nessuno di questi privilegi in realtà consente a un ruolo di leggere i dati da una tabella; SELECTper questo è necessario il privilegio sulla tabella.

  2. Non sono sicuro che esista un modo "corretto" per assegnare tutti i privilegi su tutte le tabelle a un ruolo. Il modo migliore per garantire che un determinato ruolo abbia tutti i privilegi su una tabella è assicurarsi che il ruolo sia proprietario della tabella. Per impostazione predefinita, ogni oggetto appena creato appartiene al ruolo che lo ha creato, quindi se si desidera che un ruolo abbia tutti i privilegi su una tabella, utilizzare quel ruolo per crearlo.

    PostgreSQL 9.0 introduce la seguente sintassi che è quasi ciò che si desidera:

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

    Il problema è che se si creano tabelle in schemi al di fuori dello schema "pubblico" predefinito, questo GRANTnon si applica a loro. Se usi schemi non pubblici, dovrai avere GRANTi privilegi di quegli schemi separatamente.


1
un database può avere più proprietari? in tal caso, come aggiungere un altro proprietario?
rz.

no, non credo che un database possa avere più di un proprietario, ma potresti dare loro tutte le scritture di un proprietario
hellomynameisjoel

15
non dimenticare che devi fare lo stesso sulle sequenze: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;o non puoi inserire alcun record.

Anche se non funziona, provare questo: = CONCESSIONE DI TUTTI I PRIVILEGI SU TUTTE LE TABELLE IN SCHEMA public TO your_user;
Kaustubh,

10

È possibile impostare più accessi per agire come proprietario del database:

  • Crea un ruolo "nologin" per agire come proprietario: create role dbowner nologin
  • Cambia il proprietario del tuo database in questo: alter database mydb owner dbowner
  • Concedi tutti i tuoi accessi a questo nuovo ruolo: grant dbowner to user1, user2

Ora, se si effettua il login user1 o user2, hanno tutti i permessi su "mydb" senza ulteriori sovvenzioni richieste.

Tuttavia, considererei attentamente questa soluzione. È allettante che l'applicazione Web utilizzi uno di questi accessi per evitare il fastidio di creare ulteriori sovvenzioni ogni volta che lo schema viene aggiornato, ma in questo modo rimuovi una forma di protezione molto utile. Utilizzare la soluzione di cui sopra se si desidera veramente più "amministratori", ma attenersi al modello "concedi tutti i privilegi su tutte le tabelle nello schema ..." sopra per il login per l'applicazione "uso normale".


1
Chris Cogdon, solo una piccola correzione: modifica il proprietario del database mydb in dbowner
user876743
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.