2012-05-08 10 views
18

Come si concede l'accesso in lettura/selezione a tutte le funzioni e le visualizzazioni a un utente arbitrario?Come concedere tutti i privilegi sulle viste all'utente arbitrario

Io uso psql --user=postgres -d mydb -f myview.sql per creare diverse funzioni e punti di vista, e poi corro:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; 

Dopo aver ottenuto tutti i privilegi, mi sarei aspettato myuser di avere ora accesso alle funzioni e viste create dall'utente postgres . Tuttavia, quando provo ad accedervi con myuser, ottengo un errore "permesso negato per la relazione ...". Perchè è questo?

risposta

25

Il motivo è che sono necessari privilegi aggiuntivi per accedere a una vista oa una tabella. I privilegi sul database non coprono l'accesso a tutti gli oggetti in esso contenuti.

È diverso con le funzioni: EXECUTE il privilegio è concesso a public per impostazione predefinita. Ma la funzione viene eseguita con i privilegi dell'utente corrente. Potresti essere interessato al modificatore SECURITY DEFINER per CREATE FUNCTION. Ma normalmente è sufficiente concedere SELECT sulle tabelle coinvolte.

Per documentation about default privileges:

A seconda del tipo di oggetto, i privilegi di default iniziali potrebbe comprendono la concessione di alcuni privilegi a PUBLIC. L'impostazione predefinita non è l'accesso pubblico a per tabelle, colonne, schemi e tablespace; CONNECT privilegio e TEMP privilegio di creazione di tabelle per database; EXECUTE privilegio per le funzioni; e il privilegio USAGE per le lingue.

Potreste essere interessati a questo comando DDL (richiede Postgres 9,0 o successiva):

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser; 

Durante il collegamento al database in questione, ovviamente (si veda @marcel's comment sotto), e come utente con privilegi sufficienti. Si può anche essere interessati a l'impostazione DEFAULT PRIVILEGES:

risposta più dettagliata le modalità di gestione dei privilegi:

pgAdmin ha una caratteristica f o più sofisticate operazioni di massa:

enter image description here

Oppure si può interrogare i cataloghi di sistema per creare istruzioni DDL per la concessione alla rinfusa/revoca ...

+2

Mi ci è voluta un'ora per rendermi conto che "SELEZIONA TUTTO SU TUTTE LE TAVOLE IN SCHEMA pubblico a mio figlio"; ha senso solo quando questo comando viene eseguito quando l'utente che sta concedendo è * CONNECTED * su quel database. In caso contrario, non fa nulla (o almeno non dà il permesso di selezione all'utente). Nella shell del superutente usa \ c nome_database. – marcel

+0

@marcel: ho aggiunto una nota per ricordare alla gente. –

+0

Ciò non garantisce all'utente l'autorizzazione per le sequenze. – Cerin

Problemi correlati