GRANT s su oggetti diversi sono separati. GRANT ing su un database non GRANT diritti sullo schema all'interno. Allo stesso modo, GRANT ing su uno schema non concede i diritti sulle tabelle all'interno.
Se hai i diritti su SELECT da una tabella, ma non il diritto di vederlo nello schema che lo contiene, quindi non puoi accedere alla tabella.
I test sui diritti vengono eseguiti nell'ordine:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
La tua confusione potrebbe derivare dal fatto che il public lo schema ha un GRANT predefinito di tutti i diritti al ruolo public , di cui ogni utente/gruppo è membro. Quindi tutti hanno già l'utilizzo su quello schema.
La frase:
(supponendo che siano soddisfatti anche i requisiti di privilegio degli oggetti)
Sta dicendo che devi avere USAGE su uno schema per utilizzare gli oggetti al suo interno, ma con USAGE su uno schema non è di per sé sufficiente per utilizzare gli oggetti all'interno dello schema, è necessario disporre anche dei diritti sugli oggetti stessi.
È come un albero di directory. Se crei una directory somedir con il file somefile al suo interno quindi impostalo in modo che solo il tuo utente possa accedere alla directory o al file (modalità rwx------ nella directory, modalità rw------- sul file) nessun altro può elencare la directory per vedere che il file esiste.
Se dovessi concedere i diritti di lettura mondiale sul file (modalità rw-r--r-- ) ma non modificare i permessi della directory non farebbe differenza. Nessuno poteva vedere il file per leggerlo, perché non hanno i diritti per elencare la directory.
Se invece imposti rwx-r-xr-x nella directory, impostandolo in modo che le persone possano elencare e attraversare la directory ma non modificando i permessi dei file, le persone potrebbero elencare il file ma non è stato possibile leggere perché non avrebbero accesso al file.
Devi impostare entrambi autorizzazioni per consentire alle persone di essere effettivamente in grado di visualizzare il file.
Stessa cosa a pag. Hai bisogno di entrambi gli schemi USAGE diritti e diritti sull'oggetto per eseguire un'azione su un oggetto, come SELECT da una tabella.
(L'analogia cade leggermente in quanto PostgreSQL non ha ancora la sicurezza a livello di riga, quindi l'utente può ancora "vedere" che la tabella esiste nello schema tramite SELECT da pg_class direttamente. Tuttavia, non possono interagire con esso in alcun modo, quindi è solo la parte "elenco" che non è proprio la stessa.)