Как показать все объекты и комментарии к ним в PostgreSQL?

В качестве текущего проекта мне было поручено комментировать все в базе данных postgres, тем самым документируя все объекты и то, что они делают. Есть ли скрипт SELECT, который бы показывал все таблицы, представления, столбцы, функции и т. д., а также их комментарии, в том числе с нулевыми комментариями. Ниже приведен пример того, что мне нужно:

SELECT object_type,object_schema,object_name,comment
FROM information_schema.some_table_out_there;

|object_type|object_schema|object_name|comment|
|table      | my_schema   |table1     |my first table
|table      | my_schema   |table2     |NULL
|view       | public      |employees  |NULL
|function   | public      |emps_insert|inserts employees

Я хотел бы использовать этот сценарий для создания отчета, в котором вы переходите к форме и комментируете объект базы данных желаемым комментарием.

Это может помочь вам начать работу stackoverflow.com/questions/769683/show-tables-in-postgresql

Juan Carlos Oropeza 28.05.2019 20:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
4 840
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

information_schema определяется Стандарт ANSI, поэтому он охватывает только объекты, описанные в спецификации SQL. Индексы не включены, как и ничего специфичного для Postgres (триггеры событий, политики безопасности строк и т. д.). Если вам нужен исчерпывающий список, вам нужно перейти к системные каталоги.

Нет центрального списка объектов; каждый тип объекта находится в своей собственной таблице, поэтому вам нужно запрашивать каждый из них отдельно. Однако есть несколько удобных информационные функции объекта, которые принимают любой тип объекта, поэтому мы можем довольно легко склеить эти запросы вместе с помощью некоторого динамического SQL:

create function describe_all_objects()
  returns table(
    type text,
    schema text,
    name text,
    identity text,
    comment text
  )
as $$
declare
  /* Cutoff for system object OIDs; see comments in src/include/access/transam.h */
  MIN_USER_OID constant oid = 16384;
  catalog_class regclass;
begin
  for catalog_class in
    /* Get a list of all catalog tables with an OID */
    select oid::regclass
    from pg_class
    where
      relhasoids and
      pg_class.oid < MIN_USER_OID and
      /* Enum members have no obj_description(); the enum itself is picked up in pg_type */
      pg_class.oid <> 'pg_enum'::regclass
  loop
    return query execute format(
      $SQL$
        /* Get descriptions for all user-created catalog entries */
        select
          info.type,
          info.schema,
          info.name,
          info.identity,
          coalesce(
            obj_description(catalog_table.oid, catalog_table.tableoid::regclass::text),
            shobj_description(catalog_table.oid, catalog_table.tableoid::regclass::text)
          ) as comment
        from
          %s as catalog_table,
          lateral pg_identify_object(catalog_table.tableoid, catalog_table.oid, 0) as info
        where
          catalog_table.oid >= %s
      $SQL$,
      catalog_class,
      MIN_USER_OID
    );
  end loop;

  /* Handle "sub-objects" (i.e. pg_attribute) separately */
  return query
    select 
      info.type,
      info.schema,
      info.name,
      info.identity,
      col_description(attrelid, attnum) as comment
    from
      pg_attribute,
      lateral pg_identify_object('pg_class'::regclass, attrelid, attnum) as info
    where
      attrelid >= MIN_USER_OID and
      attnum >= 0 and
      not attisdropped;
end
$$
language plpgsql stable;

select * from describe_all_objects();

Это должно охватывать объект каждый в базе данных, вплоть до неявных типов массивов таблиц и столбцов в индексах таблиц TOAST, а также объекты на уровне сервера, такие как базы данных и пользователи, поэтому вы, вероятно, захотите отфильтровать это довольно сильно. кусочек.

Некоторым таблицам каталога требуется разрешение суперпользователя для прямого доступа, но если это проблема, вы должны иметь возможность изменять запросы, чтобы получать информацию из какого-либо общедоступного источника (например, pg_authid доступен только суперпользователю, поскольку он содержит информацию о пароле, но вы вместо этого можно посмотреть pg_roles).

Дайте мне знать, если заметите какие-либо упущения (и, пожалуйста, проверьте это более тщательно, чем я, прежде чем использовать его для чего-то важного :)).

Другие вопросы по теме