Postgresql 9.6: Как найти вызывающего абонента текущей функции во время выполнения? [Дубликат]

Модно запоздалый ответ, но рассмотрели ли вы какую-то реализацию сокращения Integer? Если единственная цель состоит в том, чтобы сделать идентификатор пользователя как можно короче, мне было бы интересно узнать, есть ли какая-либо другая очевидная причина, по которой вам требуется только шестнадцатеричное преобразование, если я не пропустил его, конечно. Является ли ясным и известным (если это требуется), что идентификаторы пользователей на самом деле представляют собой шестнадцатеричное представление реального значения?

1
задан klin 27 October 2015 в 11:32
поделиться

2 ответа

Вы можете получить информацию из стека вызовов, используя get diagnostics, как описано здесь здесь .

Что-то вроде этого:

CREATE OR REPLACE FUNCTION func1()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare
  stack text;
begin
  get diagnostics stack = pg_context;
  raise notice E'--- Call Stack ---\n%',stack;
  ...
return new;
end;
$function$;

Функция тестирования:

CREATE OR REPLACE FUNCTION insertnewrecord()
 RETURNS void
 LANGUAGE plpgsql
AS $function$
begin
  insert into TableA values(...);
end;
$function$

И результат:

select insertnewrecord();
NOTICE:  --- Call Stack ---
PL/pgSQL function func1() line 6 at GET DIAGNOSTICS
SQL statement "insert into tbl values(10)"
PL/pgSQL function insertnewrecord() line 3 at SQL statement
CONTEXT:  SQL statement "insert into tbl values(10)"
PL/pgSQL function insertnewrecord() line 3 at SQL statement
 insertnewrecord 
-----------------

(1 row)

Итак, вы можете анализировать stack в func1 () и принимать на нем решения, хотя это не очень удобно.

2
ответ дан Egor Rogov 19 August 2018 в 18:10
поделиться
0
ответ дан klin 19 August 2018 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: