Как увидеть определенные комментарии к объектам базы данных?

Основная причина использования COMMENT ON IS – создать умные отчеты по документации, манипулируя ею с помощью SQL.

Руководство postgresql.org/docs/functions-info < strong>не объясняет (некрасиво). Пробую интуитивно SELECT obj_description('schemaName.tableName'::regclass) и, к счастью, сработало... Но мне нужно

  1. То же самое сделать с именами функций, но name::regclass не работает с функциями.

  2. Чтобы узнать, что такое catalog_name? Для функций, таблиц и представлений.

  3. Как легко (в настоящее время 2018) перечислить все функции или все таблицы схемы?


person Peter Krauss    schedule 05.05.2018    source источник


Ответы (1)


so=# create function t.fn() returns int as
$$
begin return 1; end; $$ language plpgsql;
CREATE FUNCTION
so=# comment on function t.fn() is 'some comment';
COMMENT
so=# select * from obj_description('t.fn'::regproc);
 obj_description
-----------------
 some comment
(1 row)

regclass для отношений, для использования функции regproc

обновить

https://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-COMMENT-TABLE

Двухпараметрическая форма obj_description возвращает комментарий к объекту базы данных, заданному его OID и именем содержащего системного каталога. Например, obj_description(123456,'pg_class') извлечет комментарий для таблицы с OID 123456. Однопараметрическая форма obj_description требует только OID объекта. Он устарел, так как нет гарантии, что OID уникальны в разных системных каталогах; поэтому может быть возвращен неправильный комментарий.

функции oids хранятся в pg_proc, таблицы и представления в pg_class (relkind r и v соответственно), таким образом:

  1. select * from obj_description('t.fn'::regproc)
  2. pg_class для таблиц и представлений, pg_proc для функций
  3. ниже запросы:

для всех функций (я добавляю order и limit, чтобы показать небольшой список UDF):

so=# select oid::regproc,obj_description(oid,tableoid::regclass::text) 
from pg_proc 
order by oid desc 
limit 2;
 oid  | obj_description
------+-----------------
 t.fn | some comment
 a    | blah
(2 rows) 

для всех таблиц:

so=# select oid::regclass,obj_description(oid,tableoid::regclass::text) from pg_class where relkind = 'r' order by oid desc limit 1;
      oid      |   obj_description
---------------+---------------------
 t."WeirdMix$" | table with bad name
(1 row)

соответственно для просмотров:

so=# select oid::regclass,obj_description(oid,tableoid::regclass::text) from pg_class where relkind = 'v' order by oid desc limit 1;
 oid | obj_description
-----+-----------------
 v   | view this is
(1 row)
person Vao Tsun    schedule 05.05.2018
comment
Спасибо! вы решили пункт 1, и все было идеально. Сможете ли вы решить пункты 2 и 3? Что касается пункта 2, проблема заключается в том, что в Руководстве указано, что obj_description(object_oid) устарело, поэтому мне нужно понять catalog_name, чтобы использовать неустаревшее obj_description(object_oid, catalog_name). - person Peter Krauss; 06.05.2018
comment
@PeterKrauss Я понимаю, откуда берется путаница. И обновил ответ - person Vao Tsun; 06.05.2018