Ja, skemaer er løsningen. Brug en enkelt PostgreSQL-klynge med en enkelt database.
Opret en gruppe for alle app-brugere:
CREATE ROLE app;
Opret et globalt "app"-skema, hvor alle globale delte applikationstabeller vises.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Opret separat bruger (uden superbrugerrettigheder) for hver af implementeringerne:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Eventuelt i stedet for IN ROLE app
, kan du give eksplicitte rettigheder til disse brugere på udvalgte app-objekter:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Opret private skemaer, hvor implementeringsafhængige tabeller vil leve:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Nu har du et privat skema for hver applikation, der er implementeret; men samtidig har du delt adgang til globale data.
Hvad er rart, er, at applikationen ikke behøver at være skema-bevidst. SELECT * FROM froobles
vil som standard løses til SELECT * FROM app01.froobles
, hvis du er tilsluttet som app01
bruger. Du behøver ikke at angive skemanavn.
Som en ekstra foranstaltning kan du bruge tabelnedarvning til at udvide globale objekter på basis af implementering:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );