Ja, scheman är lösningen. Använd ett enda PostgreSQL-kluster, med en enda databas.
Skapa en grupp för alla appanvändare:
CREATE ROLE app;
Skapa ett globalt "app"-schema, där alla globala delade applikationstabeller kommer att visas.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Skapa separata användare (utan superanvändarrättigheter) för var och en av distributionerna:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Alternativt, istället för IN ROLE app
, kan du ge uttryckliga rättigheter för dessa användare på utvalda appobjekt:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Skapa privata scheman, där distributionsberoende tabeller kommer att leva:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Nu har du ett privat schema för varje applikation som distribueras; men samtidigt har du delad tillgång till global data.
Vad som är trevligt är att applikationen inte behöver vara schemamedveten. SELECT * FROM froobles
kommer som standard att lösas till SELECT * FROM app01.froobles
, om du är ansluten som app01
användare. Du behöver inte ange schemanamn.
Som en extra åtgärd kan du använda tabellärvning för att utöka globala objekt per distribution:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );