特定のデータベースからのみ SELECT を実行できるユーザーを PostgreSQL で作成したいと思います。MySQL では、コマンドは次のようになります。
GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy';
PostgreSQL で同等のコマンドまたはコマンド シリーズは何ですか?
私は試した...
postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy';
postgres=# GRANT SELECT ON DATABASE mydb TO xxx;
しかし、データベースに付与できるのは、CREATE、CONNECT、TEMPORARY、および TEMP のみのようです。
ベストアンサー1
単一のテーブルに使用/選択権限を付与する
データベースに 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;
デフォルトでは、このコマンドを発行したユーザーが作成したオブジェクト (テーブル) にのみ影響することに注意してください。ただし、発行ユーザーがメンバーになっている任意のロールに設定することもできます。ただし、新しいオブジェクトを作成するときに、メンバーになっているすべてのロールのデフォルトの権限を取得するわけではありません... そのため、まだ多少の手間がかかります。データベースに所有ロールがあり、スキーマの変更がその所有ロールとして実行されるというアプローチを採用する場合は、その所有ロールにデフォルトの権限を割り当てる必要があります。私見では、これは少しわかりにくいので、機能的なワークフローを見つけるには実験が必要になる場合があります。
複数のテーブル/ビュー (PostgreSQL バージョン 9.0 以前)
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 SELECT に関連する GRANT コマンドがパブリックに出力されます。当然、これはすでに作成されているテーブルにのみ適用されます。