Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли узнать схему из которой вызывается функция / 12 сообщений из 12, страница 1 из 1
20.08.2020, 12:54
    #39991100
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли узнать схему из которой вызывается функция
В схеме А определена функция f1, которая может вызываться из функций (возможно с одинаковыми наименованиями) в других схемах. Можно ли внутри f1 определить из какой схемы сделан вызов, не передавая никаких дополнительных параметров?
GET DIAGNOSTICS в PG_CONTEXT возвращает только имена функций без указания схем
...
Рейтинг: 0 / 0
20.08.2020, 13:16
    #39991108
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли узнать схему из которой вызывается функция
Попробуйте вызвать current_schema()
...
Рейтинг: 0 / 0
20.08.2020, 15:42
    #39991150
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли узнать схему из которой вызывается функция
Guzya, current_schema не то, что нужно. При вызове C->B->A.f1 current_schema вернёт C, а мне надо получить B
...
Рейтинг: 0 / 0
20.08.2020, 16:03
    #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
25.08.2020, 18:04
    #39992362
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли узнать схему из которой вызывается функция
У меня PostgreSQL версия 10. PG_CONTEXT возвращает только имена функций без указания схем
...
Рейтинг: 0 / 0
25.08.2020, 18:50
    #39992370
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли узнать схему из которой вызывается функция
Kr_Yury
У меня PostgreSQL версия 10. PG_CONTEXT возвращает только имена функций без указания схем


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


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

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

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

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

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


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