PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment partager une table entre plusieurs bases de données Postgresql

Oui, les schémas sont la solution. Utilisez un seul cluster PostgreSQL, avec une seule base de données.

Créez un groupe pour tous les utilisateurs de l'application :

CREATE ROLE app;

Créez un schéma "app" global, où toutes les tables d'applications partagées globales vivront.

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

Créez un utilisateur distinct (sans droits de superutilisateur) pour chacun des déploiements :

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

Facultativement, au lieu de l'application IN ROLE app , vous pouvez accorder des droits explicites à ces utilisateurs sur les objets d'application sélectionnés :

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

Créez des schémas privés, où vivront les tables dépendantes du déploiement :

CREATE SCHEMA AUTHORIZATION app01; 
CREATE SCHEMA AUTHORIZATION app02;

Vous disposez maintenant d'un schéma privé pour chaque application déployée ; mais en même temps, vous avez un accès partagé aux données globales.

Ce qui est bien, c'est que l'application n'a pas besoin d'être sensible au schéma. SELECT * FROM froobles se résoudra par défaut en SELECT * FROM app01.froobles , si vous êtes connecté en tant que app01 utilisateur. Vous n'êtes pas obligé de spécifier le nom du schéma.

Comme mesure supplémentaire, vous pouvez utiliser l'héritage de table pour étendre les objets globaux par déploiement :

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