私の推測では、データベース内のすべての関係(テーブルとビュー)に対する権利をGRANT
再帰的に取得したいと考えています。正しい?SELECT
angel_research_production
データベース内のすべてのテーブルに付与する方法
その場合、PostgreSQL9.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 ]
GRANTのマニュアルから。ALL TABLES IN SCHEMA
句に注意してください。使用法:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO angel_research;
すべてのユーザー定義オブジェクトがpublic
スキーマ(以下を参照)にある場合は、それでうまくいきます。
以前のバージョンにはそのような機能はありませんが、ユーザー定義関数が回避策として存在します。
Pg 9.0には、新しく作成されたオブジェクトに割り当てられたデフォルトの特権を変更するALTERDEFAULTPRIVILEGESもあります。既存のオブジェクトには影響しません。
エラーメッセージはどういう意味ですか?
TokenMacGuyが指摘しているように、リレーションはテーブルまたはビューであり、データベースではありません。
GRANT SELECT ON angel_research_production TO angel_research;
の省略形と考えることができます:
GRANT SELECT ON TABLE angel_research_production TO angel_research
^^^^^
そのテーブル(関係)が存在しないため、上記のエラーが報告されます。
GRANTのマニュアルまたはpsql
\h GRANT
出力には、次の内容が表示されます。
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT
これは、データベースに対して使用できる特権が、、およびであることを示してCREATE
いCONNECT
ますTEMPORARY
。SELECT
データベースには権利がありません。
関係?スキーマ?は?
Pgには4つのレベルの組織があります。
クラスター-ポストマスターによって制御され、特定のIP /ポートコンボで接続を受け入れ、ビルトインを含む1つ以上のデータベースとデータベースを含みます。およびによって制御されます。DBクラスターは、多くの場合、インストーラーまたはパッケージによって作成されます。計算クラスターとしてのクラスターの通常の意味または一般的な英語の意味と混同しないでください。template0
template1
postgres
postgresql.conf
pg_hba.conf
データベース-1つ以上のスキーマが含まれています。Pgに接続するときに、特定のデータベースに接続します。
スキーマ-リレーションを含むオブジェクトが含まれています。特に指定しない場合、ユーザーが作成したものはすべてスキーマに入ります。クエリは、複数のスキーマ内のオブジェクトを明示的に参照することも、search_pathを介して暗黙的に参照することもできます。public
オブジェクト-ある程度PostgreSQL固有であり、スキーマに存在するもの(リレーションを含む)。