Ja, Schemata sind die Lösung. Verwenden Sie einen einzelnen PostgreSQL-Cluster mit einer einzelnen Datenbank.
Erstellen Sie eine Gruppe für alle App-Benutzer:
CREATE ROLE app;
Erstellen Sie ein globales "App"-Schema, in dem alle globalen gemeinsam genutzten Anwendungstabellen gespeichert werden.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Erstellen Sie für jede Bereitstellung einen separaten Benutzer (ohne Superuser-Rechte):
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Optional statt IN ROLE app
, können Sie diesen Benutzern explizite Rechte für ausgewählte App-Objekte gewähren:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Erstellen Sie private Schemas, in denen von der Bereitstellung abhängige Tabellen gespeichert werden:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Jetzt haben Sie ein privates Schema für jede bereitgestellte Anwendung; aber gleichzeitig haben Sie gemeinsamen Zugriff auf globale Daten.
Das Schöne ist, dass die Anwendung nicht schemabewusst sein muss. SELECT * FROM froobles
wird standardmäßig zu SELECT * FROM app01.froobles
aufgelöst , wenn Sie als app01
verbunden sind Benutzer. Sie müssen den Schemanamen nicht angeben.
Als zusätzliche Maßnahme können Sie die Tabellenvererbung verwenden, um globale Objekte pro Bereitstellung zu erweitern:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );