Источник функции извлечения postgresql

Необходимо извлечь исходный код функции PostgreSQL с помощью SQL.

Я вижу это странное поведение с одной из функций, все остальные функции (около 200+) работают абсолютно нормально.

Когда я запускаю следующий оператор, он работает:

select prosrc  from pg_proc where proname= 'accounts_count';

Однако, когда я запускаю следующее, он возвращает пустую строку:

select  routine_definition
from    information_schema.routines
where   specific_name = 'accounts_count_66243'

PostgreSQL версии 8.3. Я пробовал использовать как pgAdmin III, так и psql.

Не шоу-стоп, но было бы полезно знать, почему это может быть.

Любые идеи?


person ManiP    schedule 29.09.2012    source источник
comment
Что возвращает select length(routine_definition)...?   -  person Mike Sherrill 'Cat Recall'    schedule 30.09.2012
comment
Начиная с 8.4 есть pg_get_functiondef(). Может еще один повод обновиться на более актуальную версию?   -  person a_horse_with_no_name    schedule 30.09.2012


Ответы (1)


если вы посмотрите на определение information_schema.routines, то вы можете найти следующий фильтр:

FROM pg_namespace n, pg_proc p, pg_language l, pg_type t, pg_namespace nt
 WHERE n.oid = p.pronamespace AND p.prolang = l.oid AND p.prorettype = t.oid 
   AND t.typnamespace = nt.oid AND (pg_has_role(p.proowner, 'USAGE'::text) 
    OR has_function_privilege(p.oid, 'EXECUTE'::text));

Итак, моя теория:

  • есть некоторые проблемы с правами и владением связанной функцией (вероятно) - попробуйте использовать другую учетную запись для проверки этой теории (лучше всего postgres)
person Pavel Stehule    schedule 30.09.2012
comment
Отличная работа. Оказалось, что это проблема с правами. Владельцем функции был назначен другой пользователь. Появляется, если функция не принадлежит вошедшему в систему пользователю, information_schema.routines не отображает источник, в то время как pg_proc делает это. Странный. - person ManiP; 30.09.2012