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
何か不足していますか?それを解決するのを手伝ってくれませんか?
データベースに対するCREATE
、CONNECT
、TEMPORARY
権限を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;
コマンド @ 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
特権がある場合は、それも忘れないでください。 (たとえば、シリアル列のデフォルト値のソースとして。)
この質問に対する他の答えは正しいですが、別のオプションを提案させてください。データベースが復元されると、データベースが復元されるときのユーザーを制御できる場合があります。 pgAdmin3でこれを行う方法の詳細については不明ですが、pg_dumpおよびpg_restoreユーティリティには、これを可能にする特定のオプションが含まれています。
pg_dump --no-owner
を使用すると、ダンプファイルには所有権の復元が含まれません。 --no-owner
を使用して作成されたダンプを復元すると、復元に使用したユーザーがすべてのオブジェクトを所有します。カスタム形式のダンプファイルがあり、pg_restoreを使用している場合、pg_restoreで--no-owner
オプションを使用して、データベースの復元時に所有権の復元をスキップできます。
これには、復元を行うユーザーが、ダンプファイルに存在するオブジェクトを作成するためにデータベースに対して必要な権限を持っている必要があることに注意してください。一般的に言えば、復元を行うユーザーにデータベースレベルで「CREATE」を付与するだけで十分です。