классовый столбец в pg_description

Что такое столбец "классоид" в таблице pg_description? Я вижу, как это меняется для разных типов объектов, таких как таблица, функция и т. Д.,

В официальной документации PostgreSQL говорится, что classoid - это «OID системного каталога, в котором находится этот объект», но я этого не понимаю.

https://www.postgresql.org/docs/8.2/static/catalog-pg-description.html

Если я пытаюсь вставить некоторые комментарии в таблицу pg_description, существует ли конкретное значение, основанное на объекте? Как для таблицы -> 1259 для функции -> 1259 и т. Д.,

Если это правда, могу ли я узнать, где я могу найти этот список классоидов?


person user1720827    schedule 10.08.2017    source источник
comment
oids обычно являются первичными ключами вещей в каталогах. При обращении (через внешние ключи) к их именам добавляется префикс некоторой короткой строки. Итак, class_oid - это уникальный идентификатор указанного класса. В вашем случае вы должны посмотреть pg_class   -  person wildplasser    schedule 10.08.2017
comment
Обратите внимание, что oids скрыты. Например, SELECT * FROM pg_class не вернет oid строк, а SELECT oid,* FROM pg_class вернет.   -  person Eelke    schedule 10.08.2017


Ответы (2)


Это oid значения из pg_class, т.е. Внутренний список таблиц Postgres (среди прочего). Самый простой способ работать с ними - использовать regclass type. , например:

/* Show catalog table name for all entries */
SELECT classoid::regclass, * FROM pg_description

/* Show all entries referencing pg_proc (i.e. functions) */
SELECT objoid::regprocedure, * FROM pg_description WHERE classoid = 'pg_proc'::regclass

Однако вы действительно, действительно не должны напрямую вставлять в таблицы каталога. Могут быть связанные записи для добавления, блокировки для получения, проверки и т. Д., И если вы точно не знаете, что происходит под капотом, вы можете легко повредить свою базу данных.

Если вы хотите добавить запись в pg_description, используйте инструкцию COMMENT .

person Nick Barnes    schedule 10.08.2017
comment
привет Ник, спасибо за объяснение. Я работаю над проектом миграции данных (с SQL Server на PostgreSQL). Поэтому мне нужны все КОММЕНТАРИИ в SQL Server для PostgreSQL. Я считаю, что самый короткий способ - ВСТАВИТЬ их в таблицу pg_description. Я понял все остальные столбцы, кроме этого классоида. - person user1720827; 10.08.2017

Официальные документы и принятый ответ здесь не добавили мне ясности, поэтому я попытаюсь переформулировать ответ таким образом, чтобы это могло быть полезно другим.

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