путь просмотра в postgres (частные / отдельные версии глобально доступных таблиц) - PullRequest
1 голос
/ 18 марта 2011

Я хочу создать тестовую среду, в которой базовая базовая база данных postgres перекрывается закрытым представлением, локализованным на экземпляре, так что все запросы из определенного набора процессов проходят через закрытое представление, в то время как другие (потенциально одновременные или просто последующие) процессы останутся без изменений.

Я думаю, что могу сделать что-то подобное, используя механизм search_path , но не ясно, смогу ли я сделать это прозрачно (например, без того, чтобы каждое приложение выполняло некоторый набор настроек SQL для каждого соединения). Например, есть ли что-то, что я мог бы установить в качестве переменной среды, говорящей «use this search_path», и чтобы каждый процесс, который я запускаю после этого, видел это и использовал те же экземпляры приватной таблицы?

Если это имеет значение, все процессы проходят через адаптер C ++, libpqxx, для доступа к базе данных.

Спасибо, Джефф

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

Если у каждого экземпляра есть отдельная роль пользователя базы данных, вы можете просто создать схему с тем же именем, что и у пользователя, и он будет использовать ее - без каких-либо изменений в конфигурации:

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;
0 голосов
/ 18 марта 2011

Вы можете настроить путь поиска по умолчанию для всех соединений в файле конфигурации 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 для запроса из разных схем в зависимости от того, кто является вызывающим. Вы должны будете поддерживать таблицу или еще большее зло из двух «жестких кодов», которые пользователь / схема отображает в хранимых функциях, которые будет использовать хранимая функция.

...