16

私はこれらの2つのエラーの並置を見て、グーグルの検索結果の不足を考えると、尋ねなければなりませんでした。違いは何ですか?ここで何をする必要がありますか?

deploy=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist
deploy=# create database angel_research_production;
ERROR:  database "angel_research_production" already exists

私の推測では、他のユーザーからこの助成金選択ビジネスを行う必要があります...

だから私はこれをpostgres(dbroot)で実行し、これを取得します:

postgres=# GRANT SELECT ON angel_research_production TO angel_research;
ERROR:  relation "angel_research_production" does not exist

したがって、データベースとしては存在しますが、リレーションとしては存在しません。これをどのように修正できますか?また、ここでの根本的な問題は何ですか?私は少し圧倒されています。ありがとう

4

2 に答える 2

29

私の推測では、データベース内のすべての関係(テーブルとビュー)に対する権利をGRANT再帰的に取得したいと考えています。正しい?SELECTangel_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これは、データベースに対して使用できる特権が、、およびであることを示してCREATECONNECTますTEMPORARYSELECTデータベースには権利がありません。

関係?スキーマ?は?

Pgには4つのレベルの組織があります。

  • クラスター-ポストマスターによって制御され、特定のIP /ポートコンボで接続を受け入れ、ビルトインを含む1つ以上のデータベースとデータベースを含みます。およびによって制御されます。DBクラスターは、多くの場合、インストーラーまたはパッケージによって作成されます。計算クラスターとしてのクラスターの通常の意味または一般的な英語の意味と混同しないでください。template0template1postgrespostgresql.confpg_hba.conf

  • データベース-1つ以上のスキーマが含まれています。Pgに接続するときに、特定のデータベースに接続します。

  • スキーマ-リレーションを含むオブジェクトが含まれています。特に指定しない場合、ユーザーが作成したものはすべてスキーマに入ります。クエリは、複数のスキーマ内のオブジェクトを明示的に参照することも、search_pathを介して暗黙的に参照することもできます。public

  • オブジェクト-ある程度PostgreSQL固有であり、スキーマに存在するもの(リレーションを含む)。

于 2012-09-02T01:21:08.797 に答える
10

リレーションはテーブル(またはビューなどのテーブルのようなもの)です。つまり、すべて同じフィールドを持ち、それらを参照するための名前が付けられた行のコレクションです。

データベースは、いくつかの論理グループにまとめられたリレーションおよびその他のエンティティ(トリガー、関数、ルールなど)のコレクションです。

于 2012-09-02T01:07:38.063 に答える