добавить схему к пути в postgresql - PullRequest
5 голосов
/ 25 марта 2010

Я перехожу из всех приложений в общедоступной схеме к каждому, имеющему собственную схему. для каждого приложения у меня есть небольшой скрипт, который будет создавать схему, а затем создавать таблицы, функции и т. д. для этой схемы. Есть ли способ автоматически добавить вновь созданную схему в путь поиска? В настоящее время я вижу единственный способ найти текущий путь пользователя SHOW search_path;, а затем добавить к нему новую схему SET search_path to xxx,yyy,zzz;

Я хотел бы просто сказать, добавить схему zzz к пути users_search. это возможно?

Ответы [ 2 ]

15 голосов
/ 29 марта 2010

Используйте функцию set_config() следующим образом:

SELECT set_config(
    'search_path',
    current_setting('search_path') || ',zzz',
    false
) WHERE current_setting('search_path') !~ '(^|,)zzz(,|$)';
1 голос
/ 15 июня 2016

Основываясь на ответе теории, вот как вы постоянно добавляете схему к пути поиска другого пользователя. Полезно для настройки пользователей только для чтения и разделения настроек различных схем в различных файлах .sql.

create or replace function prepend_search_path(
    role_name text, schema_name text
) returns void as $$
declare
    current_search_path text;
begin
    -- First, we get the current search_path for that user
    select  replace(sc.configval,'search_path=','')
    from    pg_db_role_setting rs
    left 
    join    pg_roles r
    on      r.oid = rs.setrole,
    lateral unnest(rs.setconfig) as sc(configval)
    where   sc.configval like 'search_path=%'
    and r.rolname = role_name
    into current_search_path;

    -- It is possible that a new user is not in pg_roles. To fix this,
    -- we find the default search_path values.
    if not found then
        select boot_val
        from pg_settings
        where name='search_path'
        into current_search_path;
    end if;

    -- Prepend the schema_name to search_path
    if current_search_path !~ ('(^|, )' || schema_name || '(,|$)') then
        current_search_path := schema_name || ', ' || current_search_path;
    end if;


    -- Make the changes
    execute format('alter role %I set search_path = %s', role_name, current_search_path);
end
$$ language plpgsql;

Зачем нужна предварительная подготовка? Зависит от вашего варианта использования. ИМО, полезно иметь схемы для каждой хранимой процедуры. Это означает, что если вы измените хранимую процедуру, вы можете просто определить ее в отдельной схеме и переписать search_path пользователя, который ее использует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...