すべてのデータベースのすべてのテーブルに対して、select権限のみを持つユーザーを作成したい。データベースのリストを取得して、データベースごとに次のコマンドを適用できると思いました。
GRANT select ON DATABASE dbname to user1;
しかし、私は次のエラーを受け取りました:
ERROR: invalid privilege type SELECT for database
私がグーグルで言うとき、人々はgrant select
すべてのテーブルの操作。しかし、新しいテーブルは常に追加されています。したがって、これは私にとって許容できる解決策ではありません。誰かが回避策を知っていますか?
これはデータベースレベルでは実行できず、スキーマレベルでのみ実行できます。
各データベースでpublic
スキーマのみを使用していると仮定すると、これを行うことができます:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
2つのことを行う必要があります。まず、既存のオブジェクトへのアクセスを許可します。次に、これから作成される新しいオブジェクトのデフォルトアクセスを設定します。
「TABLES」へのアクセスの許可にはビューは含まれますが、シーケンス(「SERIAL」列の自動インクリメント関数など)は含まれないため、おそらくそれらへのアクセスも許可する必要があることに注意してください。
以下では、public
スキーマですべてを実行することを想定しています。 ALTER DEFAULT PRIVILEGES
ステートメントは、IN SCHEMA ...
句を省略してデータベース全体を操作できます。 GRANT
は、スキーマごとに1回実行する必要があります。
-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
IN SCHEMA public -- omit this line to make a default across all schemas
GRANT SELECT
ON TABLES
TO user1;
-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
IN SCHEMA public -- omit this line to make a default across all schemas
GRANT SELECT, USAGE
ON SEQUENCES
TO user1;
PostgreSQLマニュアル
これは受け入れられる答えではないとすでにおっしゃっていたと思いますが、とにかく正しい答えです。
セキュリティ(GRANTおよびREVOKE)の指定は、テーブルの設計とテストの一部です。
テーブル定義、セキュリティ、テスト、およびテストデータがバージョン管理される前に、テーブルを本番環境に移動しないでください。
そうは言っても、PostgreSQLにはデータベースに対するSELECTパーミッションはありません。データベースに対するCREATE、CONNECT、またはTEMP権限のみを付与できます。
特定のスキーマのすべてのテーブルにSELECTを付与できます。それがGRANTステートメントの実行後に作成されたテーブルにどのように影響するかはわかりませんが、テストはかなり簡単です。
9.0より前のバージョンのPostgresの場合:
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;'
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;'
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME
psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;'
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME