Concedi l'utilizzo / seleziona una singola tabella
Se si concede CONNECT solo a un database, l'utente può connettersi ma non ha altri privilegi. Devi concedere USAGE su spazi dei nomi (schemi) e SELECT su tabelle e viste singolarmente in questo modo:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Più tabelle / viste (PostgreSQL 9.0+)
Nelle ultime versioni di PostgreSQL, puoi concedere le autorizzazioni su tutte le tabelle / viste / etc nello schema usando un singolo comando invece di doverle digitare una per una:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Ciò riguarda solo le tabelle che sono già state create. Più efficacemente, in futuro puoi assegnare automaticamente ruoli predefiniti a nuovi oggetti :
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Si noti che per impostazione predefinita ciò influirà solo sugli oggetti (tabelle) creati dall'utente che ha emesso questo comando: sebbene possa anche essere impostato su qualsiasi ruolo di cui l'utente emittente è membro. Tuttavia, non acquisisci i privilegi predefiniti per tutti i ruoli di cui sei membro durante la creazione di nuovi oggetti ... quindi c'è ancora un po 'di confusione in giro. Se si adotta l'approccio secondo cui un database ha un ruolo proprietario e le modifiche dello schema vengono eseguite come tale ruolo proprietario, è necessario assegnare i privilegi predefiniti a quel ruolo proprietario. IMHO questo è un po 'confuso e potrebbe essere necessario sperimentare per elaborare un flusso di lavoro funzionale.
Più tabelle / viste (versioni PostgreSQL precedenti alla 9.0)
Per evitare errori nelle modifiche lunghe e multi-tabella, si consiglia di utilizzare il seguente processo "automatico" per generare il necessario GRANT SELECT
per ogni tabella / vista:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Questo dovrebbe generare i comandi GRANT pertinenti su GRANT SELECT su tutte le tabelle, viste e sequenze in pubblico, per amore di copia-incolla. Naturalmente, questo verrà applicato solo alle tabelle che sono già state create.