Официальные документы и принятый ответ здесь не добавили мне ясности, поэтому я попытаюсь переформулировать ответ таким образом, чтобы это могло быть полезно другим.
pg_description
имеет четыре столбца: objoid
, classoid
, objsubid
и description
. description
имеет комментарий, но три других значения необходимы, чтобы точно знать, что комментируется.
objoid
сообщает, к какому конкретному объекту в БД относится этот комментарий, то есть к какой реальной таблице, столбцу, процедуре. Но есть способ узнать, к чему это относится, не консультируясь с classoid
.
classoid
- это тип описываемого. Это внешний ключ в pg_class
. Столбец relname
в pg_class
указывает тип вещи.
pg_class
несколько сбивает с толку. Если вы сделаете select * from pg_class where relname = 'my_table'
, вы получите результат, но это не то, что pg_description.classoid
относится!
pg_description.classoid
должен относиться к записи в pg_class
с relname
из… строки 'pg_class'
. Это потому, что тип описываемой вещи - это класс. И, конечно же, в этом случае вы затем используете objoid
для поиска таблицы в pg_class
.
Чтобы прояснить это, предположим, что classoid
pg_description
ссылается на запись в pg_class
со значением для relname
'pg_proc'
. Это означает, что objoid
является ссылкой на pg_proc
(не на pg_class
).
Хорошо, так как же понять, что к чему?
SELECT
pg_class_objoid.relname AS "Table/View Name",
pg_description.description
FROM
pg_description
LEFT JOIN
pg_class AS pg_class_objoid ON pg_description.objoid = pg_class_objoid.oid
LEFT JOIN
pg_class AS pg_class_classoid ON pg_description.classoid = pg_class_classoid.oid
WHERE
pg_class_classoid.relname = 'pg_class'
Это говорит о присоединении pg_description.objoid
к pg_class.oid
, а также о создании отдельного соединения pg_description.classoid
с pg_class.oid
.
Затем мы ограничиваем результаты только теми, где classoid
относится к pg_class
с relname
'pg_class'
.
Теперь, если вы сделаете это, вы увидите много результатов. Вы увидите комментарии к таблицам и столбцам. Вот тут-то и пригодится objsubid
.
Для комментариев к таблице objsubid
равно 0
, таким образом:
SELECT
pg_class_objoid.relname AS "Table/View Name",
pg_description.description
FROM
pg_description
LEFT JOIN
pg_class AS pg_class_objoid ON pg_description.objoid = pg_class_objoid.oid
LEFT JOIN
pg_class AS pg_class_classoid ON pg_description.classoid = pg_class_classoid.oid
WHERE
pg_class_classoid.relname = 'pg_class' AND
pg_description.objsubid = 0
Покажу вам то, что вы хотите.
Для полноты, значения objsubid
, которые не 0, но где classoid
указывает, что тип объекта является таблицей / представлением, значение для objsubid
должно соответствовать значению pg_attribute.attnum
, где pg_attribute.attrelid
равно pg_description.objoid
. Таким образом, чтобы увидеть комментарии к таблицам и столбцам с соответствующими именами:
SELECT
pg_class_objoid.relname AS "Table/View Name",
pg_attribute.attname AS "Column Name",
pg_description.description
FROM
pg_description
LEFT JOIN
pg_class AS pg_class_objoid ON pg_description.objoid = pg_class_objoid.oid
LEFT JOIN
pg_class AS pg_class_classoid ON pg_description.classoid = pg_class_classoid.oid
LEFT JOIN
pg_attribute ON pg_attribute.attnum = pg_description.objsubid AND
pg_attribute.attrelid = pg_description.objoid
WHERE
pg_class_classoid.relname = 'pg_class'
person
davetron5000
schedule
04.03.2020
pg_class
- person wildplasser   schedule 10.08.2017SELECT * FROM pg_class
не вернет oid строк, аSELECT oid,* FROM pg_class
вернет. - person Eelke   schedule 10.08.2017