Tak, schematy są rozwiązaniem. Użyj jednego klastra PostgreSQL z jedną bazą danych.
Utwórz grupę dla wszystkich użytkowników aplikacji:
CREATE ROLE app;
Utwórz globalny schemat „aplikacji”, w którym będą znajdować się wszystkie globalne tabele współdzielonych aplikacji.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Utwórz osobnego użytkownika (bez uprawnień administratora) dla każdego z wdrożeń:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Opcjonalnie zamiast aplikacji IN ROLE app
, możesz przyznać tym użytkownikom wyraźne uprawnienia do wybranych obiektów aplikacji:
GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Utwórz prywatne schematy, w których będą znajdować się tabele zależne od wdrożenia:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Teraz masz prywatny schemat dla każdej wdrożonej aplikacji; ale jednocześnie masz współdzielony dostęp do danych globalnych.
Co miłe, aplikacja nie musi być świadoma schematów. SELECT * FROM froobles
domyślnie zostanie rozwiązany na SELECT * FROM app01.froobles
, jeśli jesteś połączony jako app01
użytkownik. Nie musisz podawać nazwy schematu.
Jako dodatkową miarę możesz użyć dziedziczenia tabeli, aby rozszerzyć globalne obiekty na podstawie wdrożenia:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );