Visión de visión en Postgres (versiones privadas/individuales de tablas disponibles a nivel mundial)

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Quiero crear un entorno de prueba en el que la base de datos de Postgres subyacente básica esté cubierta con una vista privada localizada por instancia, de modo que todas las consultas de un conjunto específico de procesos pasan por la vista privada, mientras que otros procesos (potencialmente concurrentes o meramente posteriores) permanecen inafectado.

Creo que puedo hacer algo como esto usando el Search_path Mecanismo, pero no está claro si puedo hacerlo de manera transparente (por ejemplo, sin que cada aplicación ejecute algún conjunto de configuración SQL para cada conexión). Por ejemplo, ¿hay algo que podría establecer como una variable de entorno que diga "Usar este Search_Path" y tener cada proceso que comience a ver eso y usar las mismas instancias de tabla privada?

Si es importante, todos los procesos están pasando por el adaptador C ++, libpqxx, para acceder a la base de datos.

Gracias Jeff

¿Fue útil?

Solución

Si cada instancia tiene un rol de usuario de base de datos separado, simplemente puede crear un esquema con el mismo nombre que el usuario y lo usará, sin ningún cambio en la configuración:

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 desea tener diferentes nombres para usuarios y esquemas, puede configurarlo para cada usuario manualmente:

ALTER USER foo SET search_path=foo_schema;

Otros consejos

Puede configurar la ruta de búsqueda predeterminada para todas las conexiones en el archivo de configuración posterior al Gre.

Ver http://www.postgresql.org/docs/9.0/static/runtime-config-client.html#runtime-config-client-other

Si cada conexión necesita una ruta de búsqueda personalizada en función de quién es el usuario, tendrá que hacerlo en su código y emitir un SET search_path TO x,y,z;para cada conexión.

Otra opción que viene a la mente es usar funciones almacenadas y hacer que usen SQL dinámico para consultar de diferentes esquemas en función de quién es la persona que llama. Tendría que mantener una tabla o el más malvado de los dos "código duro" las asignaciones de usuario/esquema en las funciones almacenadas que usaría la función almacenada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top