10

PostgreSQL 8.4 でスキーマ内のすべてのテーブルに DML (SELECT、INSERT、UPDATE、DELETE) を付与するにはどうすればよいですか? また、将来的に新しいテーブルを作成するためにも、この許可を保持したいと思います。

9.0 のソリューションを見てきましたが、Debian 安定版に同梱されている 8.4 で行き詰まっています。

ベースラインとして次のことを試しましたが、機能せず、必然的に「リレーション X へのアクセスが拒否されました」という結果になります。

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

ドキュメントをくまなく調べましたが、適切な解決策が見つからないようです。

4

5 に答える 5

21

また、将来的に新しいテーブルを作成するためにも、この許可を保持したいと思います。[...] ドキュメントを調べてみましたが、適切な解決策が見つからないようです。

9.0より前は何もないからです。取得できるのは、既存のテーブルのアクセス許可を設定することだけです。GRANT9.0 より前には「バルク」モードがなかったため、テーブルごとに1 つ実行する必要があります。8.4および9.0の SQL 文法を参照してください。

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

および 9.0 は次のとおりです。

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

新しいALL TABLES IN SCHEMA部分はあなたが見逃しているものです。

また、質問のようにデータベースレベルで権限を設定しても役に立ちません。データベースの権限を「のみ」設定しますが、テーブルなどの「含まれる」ものには設定しません。関連するセクション:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

つまり、データベース自体には権限のみを設定でき、権限CREATEなどCONNECTは設定できません。TEMPSELECTINSERT


これまでのところ、悪いことについてです。できることは、次のことです。

  • ユーザーではなくロールに権限を付与することで、権限管理の数を減らします。次に、個々のユーザーにロールを追加します。新しいテーブルが作成されたら、1 つまたは 2 つのロールを調整するだけで済みますが、何百ものユーザーを調整する必要はありません。

  • システム カタログを照会し、適切なGRANTコマンドを作成します。それらをファイルに保存し、そのファイルを実行します。これにより、起動が簡単になります。

このようなクエリは次のようになります。

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema');
于 2012-07-22T14:08:12.740 に答える
2

PostgreSQL の付与は再帰的ではありません。データベースに対するaGRANTは、データベース オブジェクトに対する権限を設定しますが、含まれているスキーマまたはそれらのテーブル、ビュー、関数などには影響しません。

ALL PRIVELEGESデータベースへの付与はCREATE、権限CONNECTを付与しますTEMPORARY

の意味を確認するには\h GRANT、 in psql またはin 8.4のドキュメントGRANTを参照してください。ALL PRIVILEGESDATABASE

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

動的に s を構築したり、再帰的に権限を設定しpg_catalogたりするために使用できる plpgsql 関数とさまざまなサードパーティ スクリプトが利用可能です。「postgresql recursive grant」を検索します。information_schemaGRANT

これらは、新しいテーブルのデフォルトのアクセス権を設定するのに役立ちません. PostgreSQL にはALTER DEFAULT PRIVILEGESがあり、新しいテーブルのデフォルトのテーブル権限を設定できますが、Pg 9.1 以降でのみサポートされています。GRANT古いバージョンの各テーブル、またはテーブルの作成後にパーミッションを設定する場合は、明示的なs が必要です。

ご指摘のとおり、新しいバージョンには、を介した複数の許可の機能GRANT ... ALL TABLESがありますが、質問は 8.4 に固有のものです。

于 2012-07-22T14:08:27.727 に答える
1

私はあなたがそれをすることはできないと信じています。ただし、情報スキーマを使用して権限を生成できるため、10,000 テーブルに対して手動で行う必要はありません。相対的な例については以下のリンクを参照してください。

http://www.postgresonline.com/journal/archives/30-DML-to-generate-DDL-and-DCL-Making-structural-and-Permission-changes-to-multiple-tables.html

于 2012-07-22T14:09:26.887 に答える
0

すべてのテーブルにすべての特権を追加します。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username];
于 2014-03-14T22:36:50.810 に答える