はい、スキーマが解決策です。単一のデータベースで、単一のPostgreSQLクラスターを使用します。
すべてのアプリユーザーのグループを作成します:
CREATE ROLE app;
すべてのグローバル共有アプリケーションテーブルが存在するグローバル「アプリ」スキーマを作成します。
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
デプロイメントごとに個別のユーザー(スーパーユーザー権限なし)を作成します:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
オプションで、IN ROLE app
の代わりに 、選択したアプリオブジェクトに対するこれらのユーザーに明示的な権限を付与できます:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
デプロイメントに依存するテーブルが存在するプライベートスキーマを作成します:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
これで、デプロイされたすべてのアプリケーションのプライベートスキーマができました。しかし同時に、グローバルデータへのアクセスを共有しています。
すばらしいのは、アプリケーションがスキーマ対応である必要がないことです。 SELECT * FROM froobles
デフォルトでは、SELECT * FROM app01.froobles
に解決されます 、app01
として接続している場合 ユーザー。スキーマ名を指定する必要はありません。
追加の手段として、テーブル継承を使用して、デプロイメントごとにグローバルオブジェクトを拡張できます。
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );