PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come condividere una tabella tra più database Postgresql

Sì, gli schemi sono la soluzione. Usa un singolo cluster PostgreSQL, con un unico database.

Crea un gruppo per tutti gli utenti dell'app:

CREATE ROLE app;

Crea uno schema globale di "app", in cui vivranno tutte le tabelle delle applicazioni condivise globali.

CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;

Crea un utente separato (senza diritti di superutente) per ciascuna delle distribuzioni:

CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;

Facoltativamente, invece di IN ROLE app , puoi concedere diritti espliciti a questi utenti sugli oggetti app selezionati:

GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;

Crea schemi privati, in cui vivranno le tabelle dipendenti dalla distribuzione:

CREATE SCHEMA AUTHORIZATION app01; 
CREATE SCHEMA AUTHORIZATION app02;

Ora hai uno schema privato per ogni applicazione distribuita; ma allo stesso tempo hai condiviso l'accesso ai dati globali.

La cosa bella è che l'applicazione non deve essere a conoscenza dello schema. SELECT * FROM froobles per impostazione predefinita si risolverà in SELECT * FROM app01.froobles , se sei connesso come app01 utente. Non è necessario specificare il nome dello schema.

Come misura aggiuntiva, puoi utilizzare l'ereditarietà delle tabelle per estendere gli oggetti globali in base alla distribuzione:

CREATE TABLE app01.objects (
  localattr1 int,
  localattr2 text
)
INHERITS ( app.objects );