viewpathing dans Postgres (versions privées / individuelles des tables autrement disponibles au niveau mondial)

StackOverflow https://stackoverflow.com/questions/5355502

  •  27-10-2019
  •  | 
  •  

Question

Je veux créer un environnement de test où la base de données postgres sous-jacente de base est recouverte avec une vue privée par exemple localisée, de sorte que toutes les requêtes à partir d'un ensemble spécifique de processus passent par la vue privée tandis que d'autres (potentiellement concurrente ou simplement ultérieure) les processus ne sont pas affectés.

Je pense que je peux faire quelque chose comme ceci en utilisant la search_path mécanisme, mais il ne sait pas si je peux le faire de manière transparente (par exemple, sans avoir chaque application exécuter une série de configuration SQL pour chaque connexion) . Par exemple, est-il quelque chose que je pourrais définir comme une variable d'environnement disant « utiliser ce search_path » et ont tous les processus que je commence à voir par la suite que et utiliser les mêmes instances de table privée?

S'il importe, les processus sont tous passe par l'adaptateur C ++, libpqxx, pour accéder à la base de données.

Merci, Jeff

Était-ce utile?

La solution

Si chaque instance a un rôle d'utilisateur de base de données séparée, vous pouvez simplement créer un schéma avec le même nom que l'utilisateur et il va l'utiliser - sans aucune modification de la configuration:

myuser=> show search_path;
 search_path   
--------------
"$user",public
(1 row)

myuser=> create schema myuser;
CREATE SCHEMA
myuser=> create table foo(i int);
CREATE TABLE
myuser=> \d foo
   Table "myuser.foo"
Column  Type   Modifiers 
------ ------- ---------
i      integer 

Si vous voulez avoir des noms différents pour les utilisateurs et les schémas, vous pouvez le configurer pour chaque utilisateur manuellement:

ALTER USER foo SET search_path=foo_schema;

Autres conseils

Vous pouvez configurer le chemin de recherche par défaut pour toutes les connexions dans le fichier de configuration postgre.

Voir http: / /www.postgresql.org/docs/9.0/static/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-OTHER

Si chaque connexion a besoin d'un chemin de recherche personnalisée basée sur l'utilisateur qui est vous devez faire dans votre code et émettre un SET search_path TO x,y,z;for chaque connexion.

Une autre option qui vient à l'esprit est d'utiliser les fonctions stockées et leur demander d'utiliser SQL dynamique pour interroger à partir de différents schémas en fonction de qui est l'appelant. Vous devez maintenir une table ou plus mal des deux « coder en dur » les applications utilisateur / schéma dans les fonctions stockées que la fonction stockée utiliserait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top