クイックバージョン:
データベース所有者がこのデータベース内のテーブルにアクセスできるようにするには、どのコマンドを発行する必要がありますか?これは、その所有者のアカウントから実行できますか?
長いバージョン:
RDSでデータベースを作成しています。Amazonで設定した「root」ユーザーがいます。
Amazonは自動的にグループロール「rds_superuser」を作成します。これは非常に特権がありますが、実際にはスーパーユーザーではありません。
次のように、アプリケーションのデータベースとユーザーを作成しています。
create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;
\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;
このスクリプトを更新して、これをどのように処理するかに関するCraig Ringerの提案を反映させました。
アプリが(master_application資格情報で)接続すると、テーブルを作成します(したがって、所有します)。
私の問題は、ユーザーがテーブルに対する特権を持っていないため、管理(ルート)ログインを使用してクエリを実行できないことです。
アプリケーションアカウントから次のコマンドを実行することで、これを解決できました。
GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
しかし、下位ユーザーに特権を付与して管理ユーザーに戻すのはおかしいようです。
だから...データベースの所有者がデータベース内のテーブルにアクセスできるようにするアプリケーションからテーブルを作成する前または後に実行できるコマンドはありますか?
デフォルトの特権の変更を再試行した後に更新...
それでも、テーブルへのアクセスは許可されません。私はそれが他の場所で提案されていることを見て、それは完全に理にかなっていますが、私にとってはうまくいきません。psqlシェルから:
master_integration=> \ddp
Default access privileges
Owner | Schema | Type | Access privileges
------------------+--------+-------+-------------------------------------------
integration_root | | table | integration_root=arwdDxt/integration_root+
| | | rds_superuser=arwdDxt/integration_root
(1 row)
master_integration=> \dp users
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-------+-------+-------------------+--------------------------
public | users | table | |
(1 row)
integration_rootはスーパーユーザーっぽいユーザーであり、usersはデータベース内のテーブルです。
更新
アマゾンの誰かからかなり役に立たない応答を得た。
彼らは私にmaster_applicationログインからALTER DEFAULT PRIVILEGESを呼び出すように頼みました。これはおそらく機能しますが、私の質問には答えません(これは、rds_superuserアカウントからのみこれを実現する方法です)。
私は彼らにこれを明確にするよう頼み、彼らは立ち去った。