30

すべてのデータベースのすべてのテーブルに対して選択権限のみを持つユーザーを作成したいと考えています。データベースのリストを取得し、各データベースに次のコマンドを適用できると考えました。

GRANT select ON DATABASE dbname to user1;

しかし、次のエラーが発生しました。

ERROR:  invalid privilege type SELECT for database

私がグーグルで検索したとき、人々はgrant selectすべてのテーブルに対して操作を行うようにアドバイスしました。しかし、新しいテーブルは常に追加されています。したがって、これは私にとって受け入れられる解決策ではありません。誰かが回避策を知っていますか?

4

6 に答える 6

31

これはデータベースレベルでは実行できず、スキーマレベルでのみ実行できます。

各データベースのスキーマのみを使用していると仮定するとpublic、次のことができます。

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
于 2011-06-23T13:05:36.960 に答える
31

2 つのことを行う必要があります。まず、既存のオブジェクトへのアクセスを許可します。次に、これから作成される新しいオブジェクトのデフォルト アクセスを設定します。

「TABLES」へのアクセス権の付与にはビューが含まれますが、シーケンス (「SERIAL」列の自動インクリメント機能など) は含まれないため、それらへのアクセス権も付与する必要があることに注意してください。

public以下は、スキーマ内のすべてを実行することを前提としています。このステートメントは、句ALTER DEFAULT PRIVILEGESを省略することでデータベース全体に適用できます。スキーマごとに 1 回実行する必要がありますIN SCHEMA ...GRANT

-- 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 マニュアル

于 2011-11-23T18:10:17.107 に答える
4

これは受け入れられる答えではないとすでにおっしゃっていましたが、とにかく正しい答えです。

セキュリティの指定 (GRANT および REVOKE) は、テーブルの設計とテストの一部です。

テーブル定義、セキュリティ、テスト、およびテスト データがバージョン管理される前に、テーブルを運用環境に移行しないでください。

そうは言っても、PostgreSQL にはデータベースに対する SELECT 権限がありません。データベースに対する CREATE、CONNECT、または TEMP 権限のみを付与できます。

特定のスキーマ内のすべてのテーブルに SELECT を付与できます。GRANT ステートメントの実行後に作成されたテーブルにどのように影響するかはわかりませんが、テストはかなり簡単です。

PostgreSQL 付与の構文

于 2011-06-23T11:40:35.263 に答える
3

Postgres バージョン 9.0 より前の場合:

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
于 2012-10-05T11:50:53.117 に答える
2

読み取り専用ユーザーを作成するために、次の手順を実行します。

your_user を作成します。

1. createuser --interactive --pwprompt

your_databases の postgresql に移動します。

2. psql your_database                      

アクセス権限を定義します。

3. GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user; 

デフォルトのアクセス権限を定義します:

4. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO your_user;
于 2020-04-20T11:50:50.850 に答える
0

試す:

CREATE USER readonly WITH ENCRYPTED PASSWORD 'yourpassword';
GRANT CONNECT ON DATABASE <database_name> to readonly;
GRANT USAGE ON SCHEMA public to readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
于 2021-06-01T08:14:31.400 に答える