web-dev-qa-db-ja.com

Postgresで許可が拒否されました

Postgresにユーザーmyuserを追加しました。

次に、データベースmydatabaseをpgAdmin III GUIに追加し、バックアップファイルから復元しました。したがって、mydatabaseの所有者はスーパーユーザーpostgresです。

次に、mydatabaseにアクセスしてmyuserに変更するすべての権利を与えようとしました。ユーザーpsqlとしてpostgresにログインしました:

psql -d template1 -U postgres  

そして、私はこのクエリを実行しました:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser

これでmyuserを使用してログに記録できますが、単純なクエリを実行すると次のエラーが発生します。

ERROR:  permission denied for relation table_name

何か不足していますか?それを解決するのを手伝ってくれませんか?

30
Aslan986

データベースに対するCREATECONNECTTEMPORARY権限をmyuserに付与しましたが、SELECTおよびINSERTテーブル権限はまだ付与していません。次のようなものが必要になります。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

さらに、シーケンスから描画するシリアル列または他の列のデフォルトがある場合は、 シーケンスに対する権限 が必要です。一般に、USAGE特権は、INSERT操作が機能するのに十分ですが、"give all rights"

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

マニュアルのGRANTの詳細

35
Gord Thompson

コマンド @ Gordによって提供される を使用して既に存在するオブジェクト

あなたはおそらく DEFAULT PRIVILEGES も。そのため、ユーザーmyuserも自動的に将来のオブジェクトにアクセスできます。

スキーマごとに実行できます:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;

スキーマを省略すると、データベース全体に適用されます。

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;

指定された役割によって作成されたオブジェクトにのみ適用されます(デフォルトでは、このコマンドを実行する役割に設定されます):

ALTER DEFAULT PRIVILEGES FOR ROLE administrator GRANT IN SCHEMA public ... ;

PostgreSQL 9.0以降で使用可能です。
GRANTに対するSEQUENCES特権がある場合は、それも忘れないでください。 (たとえば、シリアル列のデフォルト値のソースとして。)

11

この質問に対する他の答えは正しいですが、別のオプションを提案させてください。データベースが復元されると、データベースが復元されるときのユーザーを制御できる場合があります。 pgAdmin3でこれを行う方法の詳細については不明ですが、pg_dumpおよびpg_restoreユーティリティには、これを可能にする特定のオプションが含まれています。

pg_dump --no-ownerを使用すると、ダンプファイルには所有権の復元が含まれません。 --no-ownerを使用して作成されたダンプを復元すると、復元に使用したユーザーがすべてのオブジェクトを所有します。カスタム形式のダンプファイルがあり、pg_restoreを使用している場合、pg_restoreで--no-ownerオプションを使用して、データベースの復元時に所有権の復元をスキップできます。

これには、復元を行うユーザーが、ダンプファイルに存在するオブジェクトを作成するためにデータベースに対して必要な権限を持っている必要があることに注意してください。一般的に言えば、復元を行うユーザーにデータベースレベルで「CREATE」を付与するだけで十分です。

2
Stephen Frost