1

我想创建一个测试环境,其中基本的底层 postgres 数据库覆盖有实例本地化的私有视图,以便来自特定进程集的所有查询都通过私有视图,而其他(可能并发或仅后续)进程将保留不受影响。

我想我可以使用search_path机制来做这样的事情,但不清楚我是否可以透明地做到这一点(例如,不让每个应用程序为每个连接执行一些 SQL 设置)。例如,是否可以将某些内容设置为环境变量,说“使用此 search_path”,并让我此后启动的每个进程都看到并使用相同的私有表实例?

如果重要的话,所有进程都通过 C++ 适配器 libpqxx 来访问数据库。

谢谢,杰夫

4

2 回答 2

0

您可以在 postgre 配置文件中为所有连接配置默认搜索路径。

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

如果每个连接都需要一些基于用户身份的自定义搜索路径,则您必须在代码中执行此操作并SET search_path TO x,y,z;为每个连接发出一个。

想到的另一个选择是使用存储函数并让它们使用动态 sql 根据调用者是谁从不同的模式中查询。您将不得不维护一个表或两个“硬代码”中更邪恶的用户/模式映射到存储函数将使用的存储函数。

于 2011-03-18T18:41:59.143 回答
0

如果每个实例都有一个单独的数据库用户角色,您可以简单地创建一个与用户同名的模式,它将使用它——无需对配置进行任何更改:

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 

如果您想为用户和模式使用不同的名称,您可以手动为每个用户配置它:

ALTER USER foo SET search_path=foo_schema;
于 2011-03-18T22:02:35.240 回答