単一のテーブルに使用法/選択を許可する
データベースに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コマンドがパブリックのすべてのテーブル、ビュー、およびシーケンスのGRANTSELECTに出力されます。当然、これはすでに作成されているテーブルにのみ適用されます。