Функции Для Документирования Баз Данных Postgresql. Первая Часть

За время работы с PostgreSQL у меня накопилось более сотни функций для работы с системными каталогами: pg_class, pg_attribute, pg_constraints и т.д.

Функции для документирования баз данных PostgreSQL. Первая часть

Что с ними делать? Они используются относительно редко.

Включить в какой-либо проект? За такую «ерунду» красноярский заказчик платить не будет. И все же, а вдруг они пригодятся кому-то еще, кроме автора.

И я решил положить их, как прочитанные книги, в общественный шкаф для желающих.

Кто-то захочет использовать их в своей работе.

А кому-то будет интересен иной опыт работы с системными каталогами, чем собственный.

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

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

Расширенный список характеристик таблицы базы данных возвращается функцией admtf_Table_ComplexFeatures , которая в этой статье будет называться функцией head. Таким образом, статья ограничится рассмотрением функций, которые вызываются при выполнении головной функции.

Первая половина статьи содержит комментарии по реализации функций.

Второй содержит исходные коды функций.

Тем читателям, которых интересуют только исходные тексты, мы предлагаем сразу перейти к Приложение .

смотрите также Функции для документирования баз данных PostgreSQL. Часть вторая ; Функции для документирования баз данных PostgreSQL. Часть третья .

Функции для документирования баз данных PostgreSQL. Конец (часть четвертая) .



О каких расширенных функциях мы говорим?

Чтобы получить представление о том, что здесь подразумевается под расширенными характеристиками таблицы базы данных, давайте начнем с рассмотрения следующего списка характеристик.

Список содержит характеристики таблицы базы данных Street, возвращаемые функцией.

admtf_Table_ComplexFeatures( 'общественный' , 'улица' ) .

В таблице ниже приведен сокращенный список характеристик таблицы Street. Полный набор характеристик этой таблицы приведен в в дополнительных материалах, Приложение 2. Таблица 1. Расширенные характеристики таблицы Street.

Функции для документирования баз данных PostgreSQL. Первая часть

Текстовый вариант таблицы на рисунке

Категория Имя Комментарий тип Базовый тип ? не ноль
стол 0 улица Список улиц в населенных пунктах
внимание 1 wcrccode Код страны wcrccode smallint т
внимание 2 идентификатор местоположения Идентификатор населенного пункта идентификатор местоположения целое число т
внимание 3 идентификатор улицы Идентификатор улицы населенного пункта идентификатор улицы smallint т
внимание 4 уличный типacrm Акроним типа улицы уличный типacrm персонаж(8) ж
внимание 5 название улицы название улицы уличный типacrm варчар(150) т
ПК 0 xpkstreet Первичный ключ таблицы улиц
пкатт 1 wcrccode Код страны wcrccode smallint т
fk01 1 fk_street_locality Внешний ключ таблицы
fk02 2 fk_street_streettype Внешний ключ таблицы
idx01 1 xie1street Указатель по типу и названию улицы населенного пункта
idx02 2 xie2street Указатель по названию улицы населенного пункта
idx03 3 xie3street Указатель по названиям улиц всех населенных пунктов
idx04 4 xpkstreet Уникальный индекс (первичный ключ) таблицы улиц
Преодолев свою неприязнь к этому набору букв и цифр, вы заметите, что речь идет об обычных характеристиках таблицы базы данных:
  • Имя таблицы;
  • Список атрибутов таблицы и их типы;
  • Первичный ключ и список внешних ключей таблицы вместе с составляющими их атрибутами таблицы;
  • Список индексов таблиц.

Уникальность каждой записи из списка характеристик обеспечивается значениями полей «категория» и порядковым номером («Нет») характеристики.

Таблица 2. Категории табличных характеристик.



Функции для документирования баз данных PostgreSQL. Первая часть

Текстовый вариант таблицы на рисунке

Акроним Цель
ТБ Характеристики стола
внимание Характеристики атрибутов таблицы
последовательность Характеристики последовательности
ПК Характеристики первичного ключа
pkAtt Характеристики атрибута первичного ключа
fk99 Характеристики внешнего ключа
fk99att Характеристики атрибута внешнего ключа
fk99rtbl Характеристики таблицы, на которую ссылается внешний ключ
fk99ratt Характеристики атрибута таблицы, на которую ссылается внешний ключ
Idx99 Характеристики индекса
Idx99att Характеристики атрибутов индекса
Inhtbl99 Характеристики сформированной таблицы
Значение категории необходимо для того, чтобы отличать разные группы характеристик друг от друга.

А серийный номер - для того, чтобы различать характеристики внутри группы.

Таблица базы данных может иметь несколько внешних ключей (FOREIGN KEY) и объявленных индексов.

Следовательно, значение категории для этих характеристик и их потомков содержит порядковый номер.

Например, запись с ключом «Категория» = idx02att и «Нет» = 1 указывает на первый атрибут второго индекса.

В приведенном выше списке категорий расположение серийного номера указано как «99».

Примечание 1

Функции для документирования баз данных PostgreSQL. Первая часть

исходный код оператора на рисунке

  
  
  
  
   

SELECT * FROM admtf_Table_ComplexFeatures('pg_catalog','pg_class');

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

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

Причем в качестве параметра можно использовать, например, каталог pg_class , хотя в этом случае дается ограниченное количество характеристик.

Конец примечания.



Структура функции головы



Функции для документирования баз данных PostgreSQL. Первая часть

Рис.

1. Функции, вызываемые головной функцией.

Таблица 3. Назначение функций.



Функции для документирования баз данных PostgreSQL. Первая часть

Текстовый вариант таблицы на рисунке

Имя Цель
1 admtf_Table_Features Функция возвращает список характеристик таблицы базы данных.

2 admtf_Table_Attributes Функция возвращает список атрибутов таблицы базы данных и их характеристики.

3 admtf_Table_Constraintes Функция возвращает список ограничений таблицы базы данных и их характеристики.

4 admtf_Table_Indexes Функция возвращает список индексов таблиц базы данных и их характеристики.

5 admtf_Table_InheritanceChildrens Функция возвращает список таблиц, созданных (IHERITS) из исходной таблицы базы данных.

6 admtf_Table_Sequences Функция возвращает список последовательностей (SEQUENCE), от которых зависит таблица.

7 admtf_PrimaryKey_ComplexFeatures Функция возвращает полный (расширенный) список характеристик первичного ключа (PRIMARY KEY) таблицы базы данных.

8 admtf_ForeignKey_ComplexFeatures Функция возвращает полный (расширенный) список характеристик внешнего ключа (FOREIGN KEY) таблицы базы данных.

9 admtf_Index_ComplexFeatures Функция возвращает полный (расширенный) список характеристик индекса таблицы базы данных.

10 admtf_Table_ComplexFeatures Функция возвращает полный (расширенный) список характеристик таблицы базы данных.

Заметка 2. Описания функций будут расположены в порядке, указанном выше.

Причина в том, что статью придется разделить на несколько частей.

Причем функции, расположенные в таком порядке, можно использовать независимо от того, что некоторые из них будут описаны лишь в следующих частях публикации.

Конец примечания.



Функция admtf_Table_Features перечисляет характеристики таблицы базы данных.

Функция admtf_Table_Features возвращает список характеристик самой таблицы базы данных.

Исходный код можно посмотреть и скачать здесь.

Функция принимает имя исходной таблицы в качестве параметров.

(a_TableName ) и имя схемы, в рамках которой была создана таблица ( a_SchemaName ).

Функция извлекает основные данные из записи каталога.

pg_class , содержащий помимо записей о таблицах также записи о последовательностях, представлениях, материализованных представлениях и составных типах.

Поэтому условие relkind= используется для выбора таблиц 'р' .



SELECT tbl.relname,dsc.description,tbl.relnatts::INTEGER,tbl.relchecks::INTEGER, tbl.relhaspkey,tbl.relhasindex,tbl.relhassubclass,tbl.reltuples::INTEGER FROM pg_class tbl INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid LEFT OUTER JOIN pg_description dsc ON tbl.oid=dsc.objoid AND dsc.objsubid=0 WHERE LOWER( nspc.nspname)=LOWER(a_SchemaName) AND tbl.relkind='r' AND LOWER(tbl.relname) =LOWER(a_TableName);

Кроме того, функция обращается к данным каталога pg_namespace И pg_description .

Первый содержит имена схем базы данных, а второй — комментарии для всех объектов базы данных.

Здесь важно обратить внимание на условие objsubid=0 .

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

Комментарий к атрибуту таблицы содержится в записи, в которой объект соответствует номеру этого атрибута.

Таблица 4. Результат выполнения функции admtf_Table_Features('public','Street').

Имя Комментарий Количество атрибутов Количество ограничений CHECK ? есть ли первичный ключ? ? индексы объявлены? ? есть ли потомки Количество записей в таблице
улица Список улиц в населенных пунктах 22 0 т т ж 20150
Заметка 3 Обратите внимание на количество атрибутов в таблице улиц.

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

Таблица 5. Дополнительные атрибуты таблицы Street.

имя_аттестата типичный номер attnum Примечание
сммин 29 -4 Системный атрибут
хмин 28 -3 Системный атрибут
ctid 27 -1 Системный атрибут
wcrccode 795369 1 Эффективный атрибут
идентификатор местоположения 795352 2 Эффективный атрибут
идентификатор улицы 795364 3 Эффективный атрибут
уличный типacrm 1919168 4 Эффективный атрибут
название улицы 1043 5 Эффективный атрибут
.

стр.

выброшена.

6.

0 6 Удален атрибут
.

стр.

выброшена.

7.

0 7 Удален атрибут
Дело в том, что PostgreSQL помимо основных атрибутов дополнительно учитывает несколько системных атрибутов и даже удаленных атрибутов.

Конец примечания

Функция admtf_Table_Attributes — список атрибутов таблицы базы данных и их характеристики.

Функция admtf_Table_Attributes возвращает список атрибутов таблицы базы данных.

Исходный код можно посмотреть и скачать здесь.

Функция принимает в качестве параметров имя исходной таблицы ( a_TableName ) и имя схемы, в рамках которой была создана таблица ( a_SchemaName ).

Функция извлекает основные данные из записей каталога.

pg_attribute И pg_type .

Первый содержит записи с данными об атрибутах таблиц, представлений, материализованных представлений, составных типов и даже функций.

Во-вторых, речь идет о характеристиках и типах атрибутов.

Способ определения пользовательского и базового типов в функции может нуждаться в некоторых пояснениях.

Атрибут таблицы объявляется с пользовательским типом, если он указан в соответствующей записи каталога.

pg_type поле типбазовый тип больше 0. В противном случае атрибут имеет базовый тип.

Поэтому в предложении FROM указан каталог pg_type участвует дважды.

Первая запись каталога определяет наличие пользовательского типа, если он не определен ( типбазовыйтип=0 ), то из этой записи формируется значение базового типа.

В противном случае базовый тип определяется по записи, для которой btyp.OID= typ.typbasetype. Строка с базовым типом формируется непосредственно с помощью функции системного каталога.

FORMAT_TYPE(type_oid, typemod) .

Первым параметром которого является запись OID базового типа.

Второй параметр — это значение модификатора для типов, содержащих размер.

Например, VARCHAR(100) или NUMERIC(4,2), DECIMAL(4,2).

Значение параметра типмод взято из тип.

типтипмод в случае, если атрибут имеет пользовательский тип, в противном случае из attr.atttypmod , т. е.

непосредственно из записи атрибута.



Функции для документирования баз данных PostgreSQL. Первая часть

исходный код оператора на рисунке

SELECT attr.attnum, attr.attname::VARCHAR(100), CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::VARCHAR(100) ELSE '' END, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid), COALESCE(NULLIF(typ.typtypmod,-1),attr.atttypmod))::VARCHAR(256), attr.attnotnull, dsc.description FROM pg_attribute attr INNER JOIN pg_class tbl ON tbl.oid = attr.attrelid INNER JOIN pg_namespace nspc ON tbl.relnamespace = nspc.oid INNER JOIN pg_type typ ON attr.atttypid=typ.oid LEFT OUTER JOIN pg_description dsc ON dsc.objoid=attr.attrelid AND dsc.objsubid=attr.attnum WHERE LOWER( nspc.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname) =LOWER(a_TableName) AND tbl.relkind='r' AND attr.attnum>0 AND attr.atttypID>0 ORDER BY tbl.relname,attr.attnum;

Кроме того, функция обращается к данным каталога pg_class , pg_namespace И pg_description .

Первый и второй каталоги используются для поиска атрибутов по именам схемы базы данных и таблицы.

Третий каталог используется для получения комментария к атрибуту таблицы.

Комментарий к атрибуту таблицы находится в записи, в которой dsc.objoid содержит OID исходной таблицы и dsc.objsubid порядковый номер атрибута в таблице, т.е.

attr.attnum .

Чтобы функция не возвращала системные и удаленные атрибуты, в предложении WHERE задается условие.

attr.attnum> 0 И attr.atttypID> 0 .

Таблица 6. Результат выполнения функции admtf_Table_Attributes('public','Street').

Имя Пользовательский тип Базовый тип ? не ноль Комментарий
1 wcrccode wcrccode smallint т Код страны
2 идентификатор местоположения идентификатор местоположения целое число т Идентификатор населенного пункта
3 идентификатор улицы идентификатор улицы smallint т Идентификатор улицы населенного пункта
4 уличный типacrm уличный типacrm персонаж(8) ж Акроним типа улицы
5 название улицы варчар(150) т Название улицы населенного пункта


Версия функции, использующая псевдоним regclass для типа oid

Идентификаторы объектов (OID) в PostgreSQL имеют одноименный тип OID, который в настоящее время реализован как беззнаковое четырехбайтовое целое число.

Но благодаря наличию псевдонимов этого типа целое число может быть представлено как имя объекта.

И наоборот — преобразовать имя объекта в целое число типа OID. В качестве примера рассмотрим следующее утверждение ВЫБИРАТЬ .

Он необычным образом извлекает имена таблицы атрибутов и имена ее типов — вместо обращения к соответствующим полям каталога с именами этих характеристик он использует:

  • attrelid::regclass(attrelid::regclass:NAME) ,
  • atttypid::regtype(atttypid::regtype:NAME)
  • typebasetype::regtype(typbasetype::regtype:NAME) .



SELECT attr.attname,attr.attrelid::regclass, attr.atttypid::regtype, typ.typbasetype::regtype,attr.attrelid::regclass::name, attr.atttypid::regtype::name,typ.typbasetype::regtype::name FROM pg_attribute attr INNER JOIN pg_type typ ON attr.atttypid=typ.oid WHERE attr.attrelid=('public'||'.

'||'Street')::regclass AND attr.attnum>0 AND attr.atttypID>0 ORDER BY attr.attnum;

Ниже приведен результат выполнения этого запроса.



Функции для документирования баз данных PostgreSQL. Первая часть

В списке выходных значений оператора SELECT перед преобразованием с использованием псевдонимов типа OID все значения, кроме имени атрибута, являются числовыми, но в результате отображаются имена таблиц и типов атрибутов.

Типы выходных значений можно увидеть во второй строке заголовка таблицы.

Кроме того, в предложении WHERE оператора есть условие attr.attrelid=('public'||'.

'||'Street')::regclass , левая часть которого представляет собой числовое значение, а правая часть — строковое значение, которое преобразуется в числовое значение с помощью псевдонима регулярный класс .



Функции для документирования баз данных PostgreSQL. Первая часть

исходный код оператора на рисунке

SELECT attr.attnum, attr.attname::VARCHAR(100), CASE WHEN COALESCE(typ.typbasetype,0)>0 THEN typ.typname::VARCHAR(100) ELSE '' END, FORMAT_TYPE(COALESCE(NULLIF(typ.typbasetype,0),typ.oid),

Теги: #Администрирование базы данных #postgresql #pg_class #pg_attribute #pg_namespace #pg_description #pg_type pg_constraints #pg_index #pg_index #pg_am

Вместе с данным постом часто просматривают: