powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция для изменения search_path
21 сообщений из 21, страница 1 из 1
функция для изменения search_path
    #39106172
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хочу функцию изменения search_path типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION sp(text) RETURNS void AS
$BODY$
BEGIN  
 SET search_path TO "$user", system, $1;
END; 
$BODY$
LANGUAGE plpgsql VOLATILE;



тут проблема с соответствием типов, как можно решить задачку?

Есть функция start в которой и будет запускаться sp(схема).
Есть ли возможность изменить search_path только на время выполнения start без лишних телодвижений?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106182
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagengu,

заворачивайте "скрипт" в динамичный эскуель. т.е.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION sp(text) RETURNS void AS
$BODY$
BEGIN 
 EXECUTE concat($qry$ 
 SET search_path TO "$user", system, $qry$, $1, $qry$;
 SELECT...
 INSERT...
 CREATE...
 $qry$;
END; 
$BODY$
LANGUAGE plpgsql VOLATILE;
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106183
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho,

ну да, допустил синтакс ерор. думаю исправите.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106197
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sagengu.
Есть ли возможность изменить search_path только на время выполнения start без лишних телодвижений?

Разумеется. Для этого нужно прочитать RTFM . Там же есть пример с выставлением search_path для процедуры.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106206
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursidosagengu.
Есть ли возможность изменить search_path только на время выполнения start без лишних телодвижений?

Разумеется. Для этого нужно прочитать RTFM . Там же есть пример с выставлением search_path для процедуры.

это будет работать только если путь поиска не динамичен. судя по приведённому примеру кода, путь меняестя (может менятся) с каждым запуском.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106220
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,
исправил спасибо.
Код: sql
1.
EXECUTE concat($qry$ SET search_path TO "$user", system, $qry$, $1, $qry$; $qry$);


но как это все работает не могу понять. объясните пожалуйста.
зачем тут concat и откуда вообще и что такое $qry$
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106226
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

Что мешает использовать SET search_path в явном виде без дополнительных оберток?
То есть в сессии выполнили SET search_path , затем какие-то запросы, затем что-то еще?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106228
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursido,
к Вам вопрос. как $1 = text подставить в качестве схемы?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106244
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagengu,

concat это просто для сборки строки т.е. аналог
Код: sql
1.
EXECUTE $qry$ SET search_path TO "$user", system, $qry$ || $1 || $qry$; $qry$;

$$ или $named$ аналог кавычек. т.е. можно и так
Код: sql
1.
EXECUTE concat(' SET search_path TO "$user", system, ', $1, '; ');
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106249
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sagengu,

Нужно заморачиваться с динамическим запросом.

Поэтому я скажу: "Никак".

Предлагаю рассмотреть вариант, когда сперва выполняется установка пути поиска в явном виде, затем выполнение запросов. Все это можно сделать с клиента в рамках одной сессии.

То есть в вызывающей части пишете в явном виде:

SET search_path = <text>;
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106260
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagengu,

да, можно ещё посмотреть в сторону set_config(setting_name, new_value, is_local) , т.е. должно получится что то на подобии этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION sp(text) RETURNS void AS
$BODY$
BEGIN  
 PERFORM set_config('search_path ', concat('"$user", system, ', $1), TRUE);
END; 
$BODY$
LANGUAGE plpgsql VOLATILE;



но сам лично не использовал. так что незнаю точно какие сайд-ефекты будут.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106263
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если вдруг каким-то образом search_path выглядит следующим образом
"$user", system, system
могут ли возникнуть какие-то проблемы?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106276
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagengu,

насколько я наблюдал, нет. да и теоретически недолжно. время поиска реляции может быть дольше, а так проблем не вижу.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106277
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

Использовал при других обстоятельствах. Работает.

В данном случае будет побочный эффект: установленный search_path будет сохраняться до конца транзакции. То есть следующая команда в транзакции будет работать с заранее неизвестным search_path (то есть случайным). Это хорошая заявка на победу.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106380
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
когда искал информацию
находил такой вариант
Код: sql
1.
SET local search_path TO .......


что означает local?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106415
ursido
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sagengu,

Что об этом говорится в RTFM ?
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106443
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ursidosagengu,

Что об этом говорится в RTFM ?
не мог найти в поиске. спасибо. прочитал.
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39106607
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagenguхочу функцию изменения search_path
Эта функция называется set_config()
sagenguЕсть ли возможность изменить search_path только на время выполнения start без лишних телодвижений?
Есть:
Код: plsql
1.
alter function start set search_path to '...';
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39107929
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузановsagenguхочу функцию изменения search_path
Эта функция называется set_config()
sagenguЕсть ли возможность изменить search_path только на время выполнения start без лишних телодвижений?
Есть:
Код: plsql
1.
alter function start set search_path to '...';



мне необходима эта функция что бы установить схему в которой лежит функция или таблица.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DROP SCHEMA IF EXISTS public CASCADE; -- удаляем навсегда
DROP SCHEMA IF EXISTS system CASCADE; -- удаляем для пересоздания

CREATE SCHEMA cms; -- создаем

ALTER DATABASE current_database() SET search_path TO "$user", system;  -- просто необходимо это сделать но не получается
SET search_path TO "$user", system; -- устанавливаем что бы текущая работа попала в нужную схему system

.......
дальше создание таблиц и функций



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ОШИБКА:  ошибка синтаксиса (примерное положение: "(")
LINE 8: ALTER DATABASE current_database() SET search_path TO "$user"...
                                       ^
********** Ошибка **********

ОШИБКА: ошибка синтаксиса (примерное положение: "(")
SQL-состояние: 42601
Символ: 160



как победить ALTER DATABASE current_database() SET search_path TO "$user", system;
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39108356
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sagenguкак победить ALTER DATABASE current_database() SET search_path TO "$user", system;
Нельзя в этом месте функцию использовать, вот и ругается.

Какой инструмент для запуска скрипта с этими командами?
Если psql, то можно:
ALTER DATABASE :DBNAME SET search_path TO "$user", system;
...
Рейтинг: 0 / 0
функция для изменения search_path
    #39108506
sagengu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,
использую PgAdmin. Спасибо, буду изварачиваться как нибудь.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция для изменения search_path
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]