PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So teilen Sie eine Tabelle zwischen mehreren Postgresql-Datenbanken

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 );