Sim, os esquemas são a solução. Use um único cluster PostgreSQL, com um único banco de dados.
Crie um grupo para todos os usuários do aplicativo:
CREATE ROLE app;
Crie um esquema global de "aplicativo", onde todas as tabelas de aplicativos compartilhados globais ficarão.
CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Crie um usuário separado (sem direitos de superusuário) para cada uma das implantações:
CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Opcionalmente, em vez de
IN ROLE app
, você pode conceder direitos explícitos a esses usuários em objetos de aplicativo selecionados:GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Crie esquemas privados, onde as tabelas dependentes de implantação ficarão:
CREATE SCHEMA AUTHORIZATION app01;
CREATE SCHEMA AUTHORIZATION app02;
Agora você tem um esquema privado para cada aplicativo implementado; mas ao mesmo tempo você tem acesso compartilhado a dados globais.
O que é bom, é que o aplicativo não precisa estar ciente do esquema.
SELECT * FROM froobles
resolverá por padrão para SELECT * FROM app01.froobles
, se você estiver conectado como app01
do utilizador. Você não precisa especificar o nome do esquema. Como medida extra, você pode usar a herança de tabela para estender objetos globais por implantação:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );