powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли узнать схему из которой вызывается функция
12 сообщений из 12, страница 1 из 1
Можно ли узнать схему из которой вызывается функция
    #39991100
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В схеме А определена функция f1, которая может вызываться из функций (возможно с одинаковыми наименованиями) в других схемах. Можно ли внутри f1 определить из какой схемы сделан вызов, не передавая никаких дополнительных параметров?
GET DIAGNOSTICS в PG_CONTEXT возвращает только имена функций без указания схем
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39991108
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте вызвать current_schema()
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39991150
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya, current_schema не то, что нужно. При вызове C->B->A.f1 current_schema вернёт C, а мне надо получить B
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39991161
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury,

У меня PG_CONTEXT вместе с именем схемы выдает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
postgres=# create schema a;
CREATE SCHEMA
postgres=# create schema b;
CREATE SCHEMA
postgres=# create schema c;
CREATE SCHEMA
postgres=# create function b.f () returns text as 'begin return a.f1(); end;' language plpgsql;
CREATE FUNCTION
postgres=# create function c.f () returns text as 'begin return a.f1(); end;' language plpgsql;
CREATE FUNCTION
postgres=# create function a.f1 () returns text as $$declare s text; begin get diagnostics s = PG_CONTEXT; return s; end;$$ language plpgsql;
CREATE FUNCTION
postgres=# select b.f();
                         f                          
----------------------------------------------------
 PL/pgSQL function a.f1() line 1 at GET DIAGNOSTICS+
 PL/pgSQL function b.f() line 1 at RETURN
(1 row)

postgres=# select c.f();
                         f                          
----------------------------------------------------
 PL/pgSQL function a.f1() line 1 at GET DIAGNOSTICS+
 PL/pgSQL function c.f() line 1 at RETURN
(1 row)

postgres=# set search_path = c,b,public;
SET
postgres=# select f();
                         f                          
----------------------------------------------------
 PL/pgSQL function a.f1() line 1 at GET DIAGNOSTICS+
 PL/pgSQL function c.f() line 1 at RETURN
(1 row)



А какая версия PostgreSQL? У меня 12.
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39992362
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня PostgreSQL версия 10. PG_CONTEXT возвращает только имена функций без указания схем
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39992370
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury
У меня PostgreSQL версия 10. PG_CONTEXT возвращает только имена функций без указания схем


а у вас эти функции в search_path текущем или нет?
если нет - то должно писать с схемой...
если да - то очень странная задача тогда... и так ясно что из search_path вызывалось.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39992402
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury
У меня PostgreSQL версия 10. PG_CONTEXT возвращает только имена функций без указания схем

Перепроверил на 10.5. Всё ровно также как и в моем предыдущем примере.
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39993052
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG_CONTEXT не возвращает имена текущей схемы и public. Другие схемы возвращает. И это не зависит от того включена ли схема в путь поиска. В общем я удачно выбрал схемы для тестирования
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39993061
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже ещё не так. Текущая схема не прописывается только если вызывается функция текущей схемы. То есть, если функция текущей схемы располагается наверху стека.
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39993063
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury,

Хм, действительно, public не возвращает.
А что имеется в виду под "текущей" схемой (с учетом что это не зависит от search_path)?
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39994176
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузанов, под текущей я подразумеваю схему, которую возвращает current_schema. Да в search_path она первая.
Независимость от search_path в следующем: public может быть прописана в search_path, либо не прописана в search_path, а задана явно в вызове функции, но PG_CONTEXT её не показывает. Другие схемы могут быть прописаны в search_path, либо не прописаны в search_path, а заданы явно в вызове функции, и PG_CONTEXT их показывает в любом случае
...
Рейтинг: 0 / 0
Можно ли узнать схему из которой вызывается функция
    #39994224
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury,

В итоге, как я понял, схема public не показывается в PG_CONTEXT команды GET DIAGNOSTICS. Не показывается вне зависимости от того, указана она явно или найдена в search_path. В таком случае отсутствие схемы можно считать признаком того, что это public.

Хотя можно и в рассылку написать вопрос так ли было задумано.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли узнать схему из которой вызывается функция
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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