5

私はレールに非常に慣れていないので、これがばかげた質問でないことを願っています。

Rails で 2 つの異なるユーザー アカウントを持つ postgresql データベースを使用しようとしています。ただし、これらのアカウントを切り替えることができるようにしたいので、データベースに対して同じ権限を持ちます(理想的には両方がpostgresqlスーパーユーザーになる必要はありません)。

NOLOGINデータベースの所有者である postgres にロールを作成しました。次に、このロールに 2 つのユーザー アカウントを割り当てました。ただし、いつでもrake db:migrate、ユーザー アカウント (ロールではなく) がテーブルの所有者になります。次にユーザーを切り替えると、2 番目のユーザーは、最初のユーザーによって作成されたテーブルに対する適切なアクセス許可を持っていません。

2 つのアカウントを持つ理由は、ダウンタイムなしでパスワードを変更する必要がある場合など、すばやく切り替えることができるようにするためです。

テーブルを作成するときに特定のロールを所有者として使用するようレールに指示する方法はありますか? (または、同じ postgresql ロールの 2 つのアカウントなしでこれを達成するためのより良い方法があるのでしょうか?)

更新:これまでのところ、このソリューションを外部スクリプトとして手動で実行し、すべてのテーブルの所有権を NOLOGIN ロールに変更することがわかりましたが、よりエレガントなものやレールによく合うものを望んでいます。

4

1 に答える 1

6

PostgreSQL 側でかなりのことができます。

role2保持しているすべての特権を取得したい場合role1は、次のことができます。

GRANT role1 TO role2;

または、PostgreSQL 9.0 以降では、新しいオブジェクトにデフォルトの権限を設定するように PostgreSQL に指示できます。

ALTER DEFAULT PRIVILEGES を使用すると、将来作成されるオブジェクトに適用される権限を設定できます。(既存のオブジェクトに割り当てられた権限には影響しません。) 現在、変更できるのは、テーブル (ビューと外部テーブルを含む)、シーケンス、および関数に対する権限のみです。

ロールまたはスキーマに対してこれを行うことができます。あなたの場合、次のことができます:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role2;

複数の異なるロールで一連の権限を共有する場合は、オブジェクトに対するすべての権限を 1 つの非ログイン ロール (以前は と呼ばれていましたGROUP)に付与しrole0ます。以下の例を参照してください。そのために使用DEFAULT PRIVILEGESし、シーケンスを含む既存のオブジェクトを忘れないでください (私はそれらを忘れがちです)。
次にGRANT role0、それらの他の役割に。

これらの行に沿って:

ALTER DEFAULT PRIVILEGES FOR ROLE role1 GRANT SELECT ON TABLES TO role0;
ALTER DEFAULT PRIVILEGES FOR ROLE role2 GRANT SELECT ON TABLES TO role0;
...

GRANT role0 TO role1;
GRANT role0 TO role2;

GRANTこのようにして、必要に応じて 1 つの役割だけに特権を簡単に追加できます。このセットアップには、好きなだけロールを追加できます。

多くのDML ステートメントでは、オブジェクトの所有権が必要です。のマニュアルALTER TABLEを引用します:

ALTER TABLE を使用するには、テーブルを所有している必要があります。

テーブルを所有する役割のメンバーであることも同様に機能します。したがって、上記の例で、role0独自のテーブルを作成し、role1使用role2できる場合ALTER TABLE. 実行する:

ALTER TABLE tbl OWNER TO user0;

作成するすべてのテーブルに対して。

CREATEまたは、コマンドを実行する前にロールに滑り込みます。

SET ROLE user0;
CREATE ...;
CREATE ...;
RESET ROLE;

自分が誰であるか分からなくなった場合:

SELECT current_user, session_user;
于 2012-04-18T16:16:59.597 に答える