sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo compartir una tabla entre múltiples bases de datos Postgresql

Sí, los esquemas son la solución. Use un solo clúster de PostgreSQL, con una sola base de datos.

Crea un grupo para todos los usuarios de la aplicación:

CREATE ROLE app;

Cree un esquema de "aplicación" global, donde vivirán todas las tablas de aplicaciones compartidas globales.

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

Cree un usuario independiente (sin derechos de superusuario) para cada una de las implementaciones:

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

Opcionalmente, en lugar de IN ROLE app , puede otorgar derechos explícitos para estos usuarios en objetos de aplicaciones seleccionados:

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

Cree esquemas privados, donde vivirán las tablas dependientes de la implementación:

CREATE SCHEMA AUTHORIZATION app01; 
CREATE SCHEMA AUTHORIZATION app02;

Ahora tiene un esquema privado para cada aplicación implementada; pero al mismo tiempo tienes acceso compartido a datos globales.

Lo bueno es que la aplicación no tiene que ser compatible con esquemas. SELECT * FROM froobles se resolverá por defecto en SELECT * FROM app01.froobles , si está conectado como app01 usuario. No tiene que especificar el nombre del esquema.

Como medida adicional, puede utilizar la herencia de tablas para ampliar los objetos globales según la implementación:

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