単一のテーブルに使用/選択を許可する
データベースへのCONNECTのみを付与する場合、ユーザーは接続できますが、他の権限はありません。次のように、名前空間(スキーマ)に対してUSAGEを付与し、テーブルとビューに対してSELECTを個別に付与する必要があります。
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;
複数のテーブル/ビュー(PostgreSQL 9.0以降)
PostgreSQLの最新バージョンでは、1つずつ入力するのではなく、1つのコマンドを使用してスキーマ内のすべてのテーブル/ビューなどに権限を付与できます。
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
これは、すでに作成されているテーブルにのみ影響します。さらに強力な方法として、将来、新しいオブジェクトにデフォルトの役割を自動的に割り当てることができます。
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
デフォルトでは、これはこのコマンドを発行したユーザーが作成したオブジェクト(テーブル)にのみ影響することに注意してください。ただし、発行ユーザーがメンバーである任意のロールに設定することもできます。ただし、新しいオブジェクトを作成するときに、メンバーになっているすべてのロールのデフォルトの権限を取得するわけではないので、まだ問題があります。データベースに所有ロールがあり、スキーマの変更がその所有ロールとして実行されるというアプローチを採用する場合は、その所有ロールにデフォルトの特権を割り当てる必要があります。私見これはすべてややこしいので、機能的なワークフローを思いつくために実験する必要があるかもしれません。
複数のテーブル/ビュー(9.0より前のバージョンのPostgreSQL)
長時間にわたる複数テーブルの変更でのエラーを回避するには、次の「自動」プロセスを使用して、GRANT SELECT
各テーブル/ビューに必要なものを生成することをお勧めします。
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');
これにより、コピーアンドペーストができるように、関連するGRANTコマンドがすべてのテーブル、ビュー、シーケンスのGRANT SELECTに出力されます。当然、これはすでに作成されているテーブルにのみ適用されます。