PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como compartilhar uma tabela entre vários bancos de dados Postgresql


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