PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come si crea un utente di sola lettura in PostgreSQL?

Concedi utilizzo/selezione a una singola tabella

Se si concede CONNECT solo a un database, l'utente può connettersi ma non ha altri privilegi. Devi concedere USAGE su namespace (schemi) e SELECT su tabelle e viste individualmente 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 autorizzazioni su tutte le tabelle/viste/ecc nello schema usando un singolo comando invece di doverli digitare uno per uno:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

Ciò riguarda solo le tabelle che sono già state create. In modo più efficace, 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 sia membro. Tuttavia, non raccogli i privilegi predefiniti per tutti i ruoli di cui sei membro quando crei nuovi oggetti... quindi c'è ancora qualche chiasso in giro. Se si adotta l'approccio secondo cui un database ha un ruolo di proprietario e le modifiche allo schema vengono eseguite come tale ruolo di proprietario, è necessario assegnare i privilegi predefiniti a quel ruolo di proprietario. IMHO è tutto un po' confuso e potrebbe essere necessario sperimentare per trovare un flusso di lavoro funzionale.

Più tabelle/viste (versioni PostgreSQL precedenti alla 9.0)

Per evitare errori in lunghe modifiche a più tabelle, si consiglia di utilizzare il seguente processo "automatico" per generare il GRANT SELECT richiesto a 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 restituire i comandi GRANT pertinenti a GRANT SELECT su tutte le tabelle, viste e sequenze in pubblico, per amore di copia e incolla. Naturalmente, questo verrà applicato solo alle tabelle che sono già state create.