9.25. Системные информационные функции и операторы

В Таблице 9.63 перечислен ряд функций, предназначенных для получения информации о текущем сеансе и системе.

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

Таблица 9.63. Функции получения информации о сеансе

ИмяТип результатаОписание
current_catalognameимя текущей базы данных (в стандарте SQL она называется «каталогом»)
current_database()nameимя текущей базы данных
current_query()textтекст запроса, выполняемого в данный момент, в том виде, в каком его передал клиент (может состоять из нескольких операторов)
current_rolenameсиноним current_user
current_schema[()]nameимя текущей схемы
current_schemas(boolean)name[]имена схем в пути поиска, возможно включая схемы, добавляемые в него неявно
current_usernameимя пользователя в текущем контексте выполнения
inet_client_addr()inetадрес удалённой стороны соединения
inet_client_port()intпорт удалённой стороны соединения
inet_server_addr()inetадрес локальной стороны соединения
inet_server_port()intпорт локальной стороны соединения
pg_backend_pid()intкод серверного процесса, обслуживающего текущий сеанс
pg_blocking_pids(int)int[]идентификаторы процессов, не дающих серверному процессу с определённым ID получить блокировку
pg_conf_load_time()timestamp with time zoneвремя загрузки конфигурации
pg_current_logfile([text])textимя файла главного журнала или журнала в заданном формате, который в настоящее время используется сборщиком сообщений
pg_my_temp_schema()oidOID временной схемы этого сеанса или 0, если её нет
pg_is_other_temp_schema(oid)booleanявляется ли заданная схема временной в другом сеансе?
pg_jit_available()booleantrue, если в данном сеансе доступна JIT-компиляция (см. Главу 31) и параметр конфигурации jit включён.
pg_listening_channels()setof textимена каналов, по которым текущий сеанс принимает сигналы
pg_notification_queue_usage()doubleзанятая доля очереди асинхронных уведомлений (0-1)
pg_postmaster_start_time()timestamp with time zoneвремя запуска сервера
pg_safe_snapshot_blocking_pids(int)int[]Идентификаторы процессов, не дающих серверному процессу с определённым ID получить безопасный снимок
pg_trigger_depth()intтекущий уровень вложенности в триггерах PostgreSQL (0, если эта функция вызывается (прямо или косвенно) не из тела триггера)
session_usernameимя пользователя сеанса
usernameсиноним current_user
version()textинформация о версии PostgreSQL. Также можно прочитать версию в машинно-ориентированном виде, обратившись к переменной server_version_num.

Примечание

Функции current_catalog, current_role, current_schema, current_user, session_user и user имеют особый синтаксический статус в SQL: они должны вызываться без скобок после имени. (PostgreSQL позволяет добавить скобки в вызове current_schema, но не других функций.)

Функция session_user обычно возвращает имя пользователя, установившего текущее соединение с базой данных, но суперпользователи могут изменить это имя, выполнив команду SET SESSION AUTHORIZATION. Функция current_user возвращает идентификатор пользователя, по которому будут проверяться его права. Обычно это тот же пользователь, что и пользователь сеанса, но его можно сменить с помощью SET ROLE. Этот идентификатор также меняется при выполнении функций с атрибутом SECURITY DEFINER. На языке Unix пользователь сеанса называется «реальным», а текущий — «эффективным». Имена current_role и user являются синонимами current_user. (В стандарте SQL current_role и current_user имеют разное значение, но в PostgreSQL они не различаются, так как пользователи и роли объединены в единую сущность.)

Функция current_schema возвращает имя схемы, которая стоит первой в пути поиска (или NULL, если путь поиска пуст). Эта схема будет задействована при создании таблиц или других именованных объектов, если целевая схема не указана явно. Функция current_schemas(boolean) возвращает массив имён всех схем, находящихся в пути поиска. Её логический параметр определяет, будут ли включаться в результат неявно добавляемые в путь поиска системные схемы, такие как pg_catalog.

Примечание

Путь поиска можно изменить во время выполнения следующей командой:

SET search_path TO схема [, схема, ...]

Функция inet_client_addr возвращает IP-адрес текущего клиента, inet_client_port — номер его порта, inet_server_addr — IP-адрес сервера, по которому он принял подключение клиента, а inet_server_port — соответствующий номер порта. Все эти функции возвращают NULL, если текущее соединение устанавливается через Unix-сокет.

Функция pg_blocking_pids возвращает массив идентификаторов процессов сеансов, которые блокирует серверный процесс с указанным идентификатором, либо пустой массив, если такой серверный процесс не найден или не заблокирован. Один серверный процесс блокирует другой, если он либо удерживает блокировку, конфликтующую с блокировкой, запрашиваемой серверным процессом (жёсткая блокировка), либо ждёт блокировки, которая вызвала бы конфликт с запросом блокировки заблокированного процесса и находится перед ней в очереди ожидания (мягкая блокировка). При распараллеливании запросов эта функция всегда выдаёт видимые клиентом идентификаторы процессов (то есть, результаты pg_backend_pid), даже если фактическая блокировка удерживается или ожидается дочерним рабочим процессом. Вследствие этого, в результатах могут оказаться дублирующиеся PID. Также заметьте, что когда конфликтующую блокировку удерживает подготовленная транзакция, в выводе этой функции она будет представлена нулевым ID процесса. Частые вызовы этой функции могут отразиться на производительности базы данных, так как ей нужен монопольный доступ к общему состоянию менеджера блокировок, хоть и на короткое время.

Функция pg_conf_load_time возвращает время (timestamp with time zone), когда в последний раз сервер загружал файлы конфигурации. (Если текущий сеанс начался раньше, она возвращает время, когда эти файлы были перезагружены для данного сеанса, так что в разных сеансах это значение может немного различаться. В противном случае это будет время, когда файлы конфигурации считал главный процесс.)

Функция pg_current_logfile возвращает в значении text путь к файлам журналов, в настоящее время используемым сборщиком сообщений. Этот путь состоит из каталога log_directory и имени файла журнала. Если сборщик сообщений отключён, возвращается значение NULL. Если ведутся несколько журналов в разных форматах, при вызове функции pg_current_logfile без аргументов возвращается путь файла, имеющего первый формат по порядку из следующего списка: stderr, csvlog. Если файл журнала имеет какой-то иной формат, возвращается NULL. Чтобы запросить файл в определённом формате, передайте либо csvlog, либо stderr в качестве значения необязательного параметра типа text. Если запрошенный формат не включён в log_destination, будет возвращено значение NULL. Функция pg_current_logfile отражает содержимое файла current_logfiles.

pg_my_temp_schema возвращает OID временной схемы текущего сеанса или 0, если такой нет (в рамках сеанса не создавались временные таблицы). pg_is_other_temp_schema возвращает true, если заданный OID относится к временной схеме другого сеанса. (Это может быть полезно, например для исключения временных таблиц других сеансов из общего списка при просмотре таблиц базы данных.)

Функция pg_listening_channels возвращает набор имён каналов асинхронных уведомлений, на которые подписан текущий сеанс. Функция pg_notification_queue_usage возвращает долю от всего свободного пространства для уведомлений, в настоящее время занятую уведомлениями, ожидающими обработки, в виде значения double в диапазоне 0..1. За дополнительными сведениями обратитесь к LISTEN и NOTIFY.

pg_postmaster_start_time возвращает время (timestamp with time zone), когда был запущен сервер.

Функция pg_safe_snapshot_blocking_pids возвращает массив идентификаторов процессов сеансов, которые блокируют серверный процесс с указанным идентификатором (не дают получить ему безопасный снимок), либо пустой массив, если такой серверный процесс не найден или не заблокирован. Сеанс, выполняющий транзакцию уровня SERIALIZABLE, блокирует транзакцию SERIALIZABLE READ ONLY DEFERRABLE, не давая ей получить снимок, пока она не определит, что можно безопасно избежать установления предикатных блокировок. За дополнительными сведениями о сериализуемых и откладываемых транзакциях обратитесь к Подразделу 13.2.3. Частые вызовы этой функции могут отразиться на производительности базы данных, так как ей нужен доступ к общему состоянию менеджера предикатных блокировок, хоть и на короткое время.

Функция version возвращает строку, описывающую версию сервера PostgreSQL. Эту информацию также можно получить из переменной server_version или, в более машинно-ориентированном формате, из переменной server_version_num. При разработке программ следует использовать server_version_num (она появилась в версии 8.2) либо PQserverVersion , а не разбирать текстовую версию.

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

Таблица 9.64. Функции для проверки прав доступа

ИмяТип результатаОписание
has_any_column_privilege(user, таблица, privilege)booleanимеет ли пользователь указанное право для какого-либо столбца таблицы
has_any_column_privilege(таблица, privilege)booleanимеет ли текущий пользователь указанное право для какого-либо столбца таблицы
has_column_privilege(user, таблица, столбец, privilege)booleanимеет ли пользователь указанное право для столбца
has_column_privilege(таблица, столбец, privilege)booleanимеет ли текущий пользователь указанное право для столбца
has_database_privilege(user, database, privilege)booleanимеет ли пользователь указанное право для базы данных
has_database_privilege(database, privilege)booleanимеет ли текущий пользователь указанное право для базы данных
has_foreign_data_wrapper_privilege(user, fdw, privilege)booleanимеет ли пользователь указанное право для обёртки сторонних данных
has_foreign_data_wrapper_privilege(fdw, privilege)booleanимеет ли текущий пользователь указанное право для обёртки сторонних данных
has_function_privilege(user, function, privilege)booleanимеет ли пользователь указанное право для функции
has_function_privilege(function, privilege)booleanимеет ли текущий пользователь указанное право для функции
has_language_privilege(user, language, privilege)booleanимеет ли пользователь указанное право для языка
has_language_privilege(language, privilege)booleanимеет ли текущий пользователь указанное право для языка
has_schema_privilege(user, schema, privilege)booleanимеет ли пользователь указанное право для схемы
has_schema_privilege(schema, privilege)booleanимеет ли текущий пользователь указанное право для схемы
has_sequence_privilege(user, sequence, privilege)booleanимеет ли пользователь указанное право для последовательности
has_sequence_privilege(sequence, privilege)booleanимеет ли текущий пользователь указанное право для последовательности
has_server_privilege(user, server, privilege)booleanимеет ли пользователь указанное право для стороннего сервера
has_server_privilege(server, privilege)booleanимеет ли текущий пользователь указанное право для стороннего сервера
has_table_privilege(user, таблица, privilege)booleanимеет ли пользователь указанное право для таблицы
has_table_privilege(таблица, privilege)booleanимеет ли текущий пользователь указанное право для таблицы
has_tablespace_privilege(user, tablespace, privilege)booleanимеет ли пользователь указанное право для табличного пространства
has_tablespace_privilege(tablespace, privilege)booleanимеет ли текущий пользователь указанное право для табличного пространства
has_type_privilege(user, type, privilege)booleanимеет ли пользователь указанное право для типа
has_type_privilege(type, privilege)booleanимеет ли текущий пользователь указанное право для типа
pg_has_role(user, role, privilege)booleanимеет ли пользователь указанное право для роли
pg_has_role(role, privilege)booleanимеет ли текущий пользователь указанное право для роли
row_security_active(таблица)booleanвключена ли для текущего пользователя защита на уровне строк для таблицы

has_table_privilege проверяет, может ли пользователь выполнять с таблицей заданные действия. В качестве идентификатора пользователя можно задать его имя, OID (pg_authid.oid) или public (это будет указывать на псевдороль PUBLIC). Если этот аргумент опущен, подразумевается текущий пользователь (current_user). Таблицу можно указать по имени или по OID. (Таким образом, фактически есть шесть вариантов функции has_table_privilege, различающихся по числу и типу аргументов.) Когда указывается имя объекта, его можно дополнить именем схемы, если это необходимо. Интересующее право доступа записывается в виде текста и может быть одним из следующих: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES и TRIGGER. Дополнительно к названию права можно добавить WITH GRANT OPTION и проверить, разрешено ли пользователю передавать это право другим. Кроме того, в одном параметре можно перечислить несколько названий прав через запятую, и тогда функция возвратит true, если пользователь имеет одно из этих прав. (Регистр в названии прав не имеет значения, а между ними (но не внутри) разрешены пробельные символы.) Пара примеров:

SELECT has_table_privilege('myschema.mytable', 'select');
SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

has_sequence_privilege проверяет, может ли пользователь выполнять заданные действия с последовательностью. В определении аргументов эта функция аналогична has_table_privilege. Допустимые для неё права складываются из USAGE, SELECT и UPDATE.

has_any_column_privilege проверяет, может ли пользователь выполнять заданные действия с каким-либо столбцом таблицы. В определении аргументов эта функция аналогична has_table_privilege, а допустимые права складываются из SELECT, INSERT, UPDATE и REFERENCES. Заметьте, что любое из этих прав, назначенное на уровне таблицы, автоматически распространяется на все её столбцы, так что has_any_column_privilege всегда возвращает true, если has_table_privilege даёт положительный ответ для тех же аргументов. Но has_any_column_privilege возвращает true ещё и тогда, когда право назначено только для некоторых столбцов.

has_column_privilege проверяет, может ли пользователь выполнять заданные действия со столбцом таблицы. В определении аргументов эта функция аналогична has_table_privilege, с небольшим дополнением: столбец можно задать по имени или номеру атрибута. Для неё допустимые права складываются из SELECT, INSERT, UPDATE и REFERENCES. Заметьте, что любое из этих прав, назначенное на уровне таблицы, автоматически распространяется на все столбцы таблицы.

has_database_privilege проверяет, может ли пользователь выполнять заданные действия с базой данных. В определении аргументов эта функция аналогична has_table_privilege. Для неё допустимые права складываются из CREATE, CONNECT и TEMPORARY (или TEMP, что равносильно TEMPORARY).

has_function_privilege проверяет, может ли пользователь обратиться к заданной функции. В определении аргументов эта функция аналогична has_table_privilege. Когда функция определяется не своим OID, а текстовой строкой, эта строка должна быть допустимой для вводимого значения типа regprocedure (см. Раздел 8.19). Для этой функции допустимо только право EXECUTE. Например:

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_foreign_data_wrapper_privilege проверяет, может ли пользователь обращаться к обёртке сторонних данных. В определении аргументов она аналогична has_table_privilege. Для неё допустимо только право USAGE.

has_language_privilege проверяет, может ли пользователь обращаться к процедурному языку. В определении аргументов эта функция аналогична has_table_privilege. Для неё допустимо только право USAGE.

has_schema_privilege проверяет, может ли пользователь выполнять заданные действия со схемой. В определении аргументов эта функция аналогична has_table_privilege. Для неё допустимые права складываются из CREATE и USAGE.

has_server_privilege проверяет, может ли пользователь обращаться к стороннему серверу. В определении аргументов она аналогична has_table_privilege. Для неё допустимо только право USAGE.

has_tablespace_privilege проверяет, может ли пользователь выполнять заданное действие в табличном пространстве. В определении аргументов эта функция аналогична has_table_privilege. Для неё допустимо только право CREATE.

has_type_privilege проверяет, может ли пользователь обратиться к типу определённым образом. Возможные аргументы аналогичны has_table_privilege. При указании типа текстовой строкой, а не по OID, допускаются те же входные значения, что и для типа данных regtype (см. Раздел 8.19). Для неё допустимо только право USAGE.

pg_has_role проверяет, может ли пользователь выполнять заданные действия с ролью. В определении аргументов эта функция аналогична has_table_privilege, за исключением того, что именем пользователя не может быть public. Для неё допустимые права складываются из MEMBER и USAGE. MEMBER обозначает прямое или косвенное членство в данной роли (то есть наличие права выполнить команду SET ROLE), тогда как USAGE показывает, что пользователь получает все права роли сразу, без SET ROLE. К любому из этих типов прав можно добавить WITH ADMIN OPTION или WITH GRANT OPTION, чтобы проверить наличие права ADMIN (все четыре варианта написания проверяют одно и то же).

row_security_active проверяет, включена ли защита на уровне строк для указанной таблицы в контексте и окружении текущего пользователя (current_user). Таблицу можно задать по имени или OID.

В Таблице 9.65 показаны операторы, предназначенные для работы с типом aclitem, который представляет в системном каталоге права доступа. О содержании значений этого типа рассказывается в Разделе 5.7.

Таблица 9.65. Операторы для типа aclitem

ОператорОписаниеПримерРезультат
=равно'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitemf
@>содержит элемент'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*w/hobbes'::aclitemt
~содержит элемент'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*w/hobbes'::aclitemt

В Таблице 9.66 приведены дополнительные функции, предназначенные для работы с типом aclitem.

Таблица 9.66. Функции для типа aclitem

ИмяТип результатаОписание
acldefault(type, ownerId)aclitem[]выдаёт права доступа по умолчанию, назначенные объектам, которые принадлежат роли ownerId
aclexplode(aclitem[])setof recordвыдаёт массив aclitem в виде кортежей
makeaclitem(grantee, grantor, privilege, grantable)aclitemконструирует значение aclitem из отдельных аргументов

Функция acldefault возвращает встроенный и действующий по умолчанию набор прав доступа для объектов типа type, принадлежащих роли ownerId. Её результат показывает, какие права доступа подразумеваются, когда список ACL определённого объекта пуст. (Права доступа, действующие по умолчанию, описываются в Разделе 5.7.) Параметр type имеет тип char и может принимать одно из следующих значений: 'c' — столбец (COLUMN), 'r' — таблица или подобный таблице объект (TABLE), 's' — последовательность (SEQUENCE), 'd' — база данных (DATABASE), 'f' — функция (FUNCTION) или процедура (PROCEDURE), 'l' — язык (LANGUAGE), 'L' — большой объект (LARGE OBJECT), 'n' — схема (SCHEMA), 't' — табличное пространство (TABLESPACE), 'F' — обёртка сторонних данных (FOREIGN DATA WRAPPER), 'S' — сторонний сервер (FOREIGN SERVER) и 'T' — тип (TYPE) или домен (DOMAIN).

Функция aclexplode возвращает массив aclitem в виде набора строк. В столбцах этих строк содержится oid праводателя, oid правообладателя (0 означает PUBLIC), данное право в виде значения text (SELECT, ...) и признак разрешения передачи этого права в виде значения boolean. Функция makeaclitem выполняет обратное преобразование.

В Таблице 9.67 перечислены функции, определяющие видимость объекта с текущим путём поиска схем. К примеру, таблица считается видимой, если содержащая её схема включена в путь поиска и нет другой таблицы с тем же именем, которая была бы найдена по пути поиска раньше. Другими словами, к этой таблице можно будет обратиться просто по её имени, без явного указания схемы. Просмотреть список всех видимых таблиц можно так:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Таблица 9.67. Функции для определения видимости

ИмяТип результатаОписание
pg_collation_is_visible(collation_oid)booleanвидимо ли правило сортировки
pg_conversion_is_visible(conversion_oid)booleanвидимо ли преобразование
pg_function_is_visible(function_oid)booleanвидима ли функция
pg_opclass_is_visible(opclass_oid)booleanвидим ли класс операторов
pg_operator_is_visible(operator_oid)booleanвидим ли оператор
pg_opfamily_is_visible(opclass_oid)booleanвидимо ли семейство операторов
pg_statistics_obj_is_visible(stat_oid)booleanвидим ли объект статистики в пути поиска
pg_table_is_visible(table_oid)booleanвидима ли таблица
pg_ts_config_is_visible(config_oid)booleanвидима ли конфигурация текстового поиска
pg_ts_dict_is_visible(dict_oid)booleanвидим ли словарь текстового поиска
pg_ts_parser_is_visible(parser_oid)booleanвидим ли анализатор текстового поиска
pg_ts_template_is_visible(template_oid)booleanвидим ли шаблон текстового поиска
pg_type_is_visible(type_oid)booleanвидим ли тип (или домен)

Каждая из этих функций проверяет видимость объектов определённого типа. Заметьте, что pg_table_is_visible можно также использовать для представлений, материализованных представлений, индексов, последовательностей и сторонних таблиц; pg_function_is_visible — для процедур и агрегатных функций; pg_type_is_visible — для доменов. Для функций и операторов объект считается видимым в пути поиска, если при просмотре пути не находится предшествующий ему другой объект с тем же именем и типами аргументов. Для классов операторов во внимание принимается и имя оператора, и связанный с ним метод доступа к индексу.

Всем этим функциям должен передаваться OID проверяемого объекта. Если вы хотите проверить объект по имени, удобнее использовать типы-псевдонимы OID (regclass, regtype, regprocedure, regoperator, regconfig или regdictionary), например:

SELECT pg_type_is_visible('myschema.widget'::regtype);

Заметьте, что проверять таким способом имена без указания схемы не имеет большого смысла — если имя удастся распознать, значит и объект будет видимым.

В Таблице 9.68 перечислены функции, извлекающие информацию из системных каталогов.

Таблица 9.68. Функции для обращения к системным каталогам

ИмяТип результатаОписание
format_type(type_oid, typemod)textполучает имя типа данных в формате SQL
pg_get_constraintdef(constraint_oid)textполучает определение ограничения
pg_get_constraintdef(constraint_oid, pretty_bool)textполучает определение ограничения
pg_get_expr(pg_node_tree, relation_oid)textдекомпилирует внутреннюю форму выражения, в предположении, что все переменные в нём ссылаются на таблицу или отношение, указанное вторым параметром
pg_get_expr(pg_node_tree, relation_oid, pretty_bool)textдекомпилирует внутреннюю форму выражения, в предположении, что все переменные в нём ссылаются на таблицу или отношение, указанное вторым параметром
pg_get_functiondef(func_oid)textполучает определение функции или процедуры
pg_get_function_arguments(func_oid)textполучает список аргументов из определения функции или процедуры (со значениями по умолчанию)
pg_get_function_identity_arguments(func_oid)textполучает список аргументов, идентифицирующий функцию или процедуру (без значений по умолчанию)
pg_get_function_result(func_oid)textполучает предложение RETURNS для функции (для процедуры возвращает NULL)
pg_get_indexdef(index_oid)textполучает команду CREATE INDEX для индекса
pg_get_indexdef(index_oid, column_no, pretty_bool)textполучает команду CREATE INDEX для индекса или определение одного индексированного столбца, когда column_no не равен 0
pg_get_keywords()setof recordполучает список ключевых слов SQL по категориям
pg_get_ruledef(rule_oid)textполучает команду CREATE RULE для правила
pg_get_ruledef(rule_oid, pretty_bool)textполучает команду CREATE RULE для правила
pg_get_serial_sequence(table_name, column_name)textполучает имя последовательности, используемой столбцом идентификации или столбцом serial
pg_get_statisticsobjdef(statobj_oid)textполучает команду CREATE STATISTICS для объекта расширенной статистики
pg_get_triggerdef(trigger_oid)textполучает команду CREATE [ CONSTRAINT ] TRIGGER для триггера
pg_get_triggerdef(trigger_oid, pretty_bool)textполучает команду CREATE [ CONSTRAINT ] TRIGGER для триггера
pg_get_userbyid(role_oid)nameполучает имя роли по заданному OID
pg_get_viewdef(view_name)textполучает команду SELECT, определяющую представление или материализованное представление (устаревшая функция)
pg_get_viewdef(view_name, pretty_bool)textполучает команду SELECT, определяющую представление или материализованное представление (устаревшая функция)
pg_get_viewdef(view_oid)textполучает команду SELECT, определяющую представление или материализованное представление
pg_get_viewdef(view_oid, pretty_bool)textполучает команду SELECT, определяющую представление или материализованное представление
pg_get_viewdef(view_oid, wrap_column_int)textполучает команду SELECT, определяющую представление или материализованное представление; при необходимости разбивает строки с полями, выходящие за wrap_int символов, подразумевая форматированный вывод
pg_index_column_has_property(index_oid, column_no, prop_name)booleanпроверяет, имеет ли столбец индекса заданное свойство
pg_index_has_property(index_oid, prop_name)booleanпроверяет, имеет ли индекс заданное свойство
pg_indexam_has_property(am_oid, prop_name)booleanпроверяет, имеет ли метод доступа индекса заданное свойство
pg_options_to_table(reloptions)setof recordполучает набор параметров хранилища в виде имя/значение
pg_tablespace_databases(tablespace_oid)setof oidполучает или устанавливает OID баз данных, объекты которых содержатся в заданном табличном пространстве
pg_tablespace_location(tablespace_oid)textполучает путь в файловой системе к местоположению заданного табличного пространства
pg_typeof(any)regtypeполучает тип данных любого значения
collation for (any)textполучает правило сортировки для аргумента
to_regclass(rel_name)regclassполучает OID указанного отношения
to_regproc(func_name)regprocполучает OID указанной функции
to_regprocedure(func_name)regprocedureполучает OID указанной функции
to_regoper(имя_оператора)regoperполучает OID указанного оператора
to_regoperator(имя_оператора)regoperatorполучает OID указанного оператора
to_regtype(type_name)regtypeполучает OID указанного типа
to_regnamespace(schema_name)regnamespaceполучает OID указанной схемы
to_regrole(role_name)regroleполучает OID указанной роли

format_type возвращает в формате SQL имя типа данных, определяемого по OID и, возможно, модификатору типа. Если модификатор неизвестен, вместо него можно передать NULL.

pg_get_keywords возвращает таблицу с ключевыми словами SQL, которые воспринимает сервер. Столбец word содержит ключевое слово, а catcode — код категории: U — не зарезервировано, C — имя столбца, T — имя типа или функции, R — зарезервировано. Столбец catdesc содержит возможно локализованное описание категории.

pg_get_constraintdef, pg_get_indexdef, pg_get_ruledef, pg_get_statisticsobjdef и pg_get_triggerdef восстанавливают команду, создававшую заданное ограничение, индекс, правило, объект статистики или триггер, соответственно. (Учтите, что они возвращают не изначальный текст команды, а результат декомпиляции.) pg_get_expr декомпилирует внутреннюю форму отдельного выражения, например значения по умолчанию для столбца. Это может быть полезно для изучения содержимого системных каталогов. Если выражение может содержать переменные, укажите во втором параметре OID отношения, на который они ссылаются; если таких переменных нет, вместо OID можно передать 0. pg_get_viewdef восстанавливает запрос SELECT, определяющий представление. Многие из этих функций имеют две версии, одна из которых позволяет получить форматированный вывод (с параметром pretty_bool). Форматированный текст легче читается, но нет гарантии, что он будет всегда восприниматься одинаково будущими версиями PostgreSQL; поэтому не следует применять форматирование при выгрузке метаданных. Если в параметре pretty_bool передаётся false, эта версия функции выдаёт тот же результат, что и версия без параметров.

pg_get_functiondef возвращает полный оператор CREATE OR REPLACE FUNCTION для заданной функции. pg_get_function_arguments возвращает список аргументов функции, в виде достаточном для включения в команду CREATE FUNCTION. pg_get_function_result в дополнение возвращает готовое предложение RETURNS для функции. pg_get_function_identity_arguments возвращает список аргументов, достаточный для однозначной идентификации функции, в форме, допустимой, например для команды ALTER FUNCTION. Значения по умолчанию в этой форме опускаются.

pg_get_serial_sequence возвращает имя последовательности, связанной со столбцом, либо NULL, если такой последовательности нет. Для столбца идентификации это будет последовательность, связанная с ним внутренним образом. Для столбцов, имеющих один из последовательных типов (serial, smallserial, bigserial), это последовательность, созданная объявлением данного столбца. В последнем случае эту связь можно изменить или разорвать, воспользовавшись командой ALTER SEQUENCE OWNED BY. (Возможно, эту функцию стоило назвать pg_get_owned_sequence; её существующее имя отражает тот факт, что она обычно используется со столбцами serial или bigserial.) В первом параметре функции указывается имя таблицы (возможно, дополненное схемой), а во втором имя столбца. Так как первый параметр может содержать имя схемы и таблицы, он воспринимается не как идентификатор в кавычках и поэтому по умолчанию приводится к нижнему регистру, тогда как имя столбца во втором параметре воспринимается как заключённое в кавычки и в нём регистр символов сохраняется. Эта функция возвращает имя в виде, пригодном для передачи функциям, работающим с последовательностями (см. Раздел 9.16). Обычно она применяется для получения текущего значения последовательности для столбца идентификации или последовательного столбца, например:

SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_userbyid получает имя роли по её OID.

Функции pg_index_column_has_property, pg_index_has_property и pg_indexam_has_property показывают, обладает ли указанный столбец индекса, индекс или метод доступа индекса заданным свойством. Они возвращают NULL, если имя свойства неизвестно или неприменимо к конкретному объекту, либо если OID или номер столбца не указывают на действительный объект. Описание свойств столбцов вы можете найти в Таблице 9.69, свойства индексов описаны в Таблице 9.70, а свойства методов доступа — в Таблица 9.71. (Заметьте, что методы доступа, реализуемые расширениями, могут определять для своих индексов дополнительные имена свойств.)

Таблица 9.69. Свойства столбца индекса

ИмяОписание
ascСортируется ли столбец по возрастанию при сканировании вперёд?
descСортируется ли столбец по убыванию при сканировании вперёд?
nulls_firstВыдаются ли NULL в начале при сканирования вперёд?
nulls_lastВыдаются ли NULL в конце при сканировании вперёд?
orderableСвязан ли со столбцом некоторый порядок сортировки?
distance_orderableМожет ли столбец сканироваться по порядку оператором «расстояния», например, ORDER BY столбец <-> константа ?
returnableМожет ли значение столбца быть получено при сканировании только индекса?
search_arrayПоддерживает ли столбец внутренними средствами поиск столбец = ANY(массив)?
search_nullsПоддерживает ли столбец поиск IS NULL и IS NOT NULL?

Таблица 9.70. Свойства индекса

ИмяОписание
clusterableМожет ли индекс использоваться в команде CLUSTER?
index_scanПоддерживает ли индекс простое сканирование (не по битовой карте)?
bitmap_scanПоддерживает ли индекс сканирование по битовой карте?
backward_scanМожет ли в процессе сканирования меняться направление (для поддержки перемещения курсора FETCH BACKWARD без необходимости материализации)?

Таблица 9.71. Свойства метода доступа индекса

ИмяОписание
can_orderПоддерживает ли метод доступа ASC, DESC и связанные ключевые слова в CREATE INDEX?
can_uniqueПоддерживает ли метод доступа уникальные индексы?
can_multi_colПоддерживает ли метод доступа индексы по нескольким столбцам?
can_excludeПоддерживает ли метод доступа ограничения-исключения?
can_includeПоддерживает ли метод доступа предложение INCLUDE команды CREATE INDEX?

pg_options_to_table возвращает набор параметров хранилища в виде пар (имя_параметра/значение_параметра), когда ей передаётся pg_class.reloptions или pg_attribute.attoptions.

pg_tablespace_databases позволяет изучить содержимое табличного пространства. Она возвращает набор OID баз данных, объекты которых размещены в этом табличном пространстве. Если эта функция возвращает строки, это означает, что табличное пространство не пустое и удалить его нельзя. Какие именно объекты находятся в табличном пространстве, можно узнать, подключаясь к базам данных, OID которых сообщила pg_tablespace_databases, и анализируя их каталоги pg_class.

pg_typeof возвращает OID типа данных для переданного значения. Это может быть полезно для разрешения проблем или динамического создания SQL-запросов. Эта функция объявлена как возвращающая тип regtype, который является псевдонимом типа OID (см. Раздел 8.19); это означает, что значение этого типа можно сравнивать как OID, но выводится оно как название типа. Например:

SELECT pg_typeof(33);

 pg_typeof 
-----------
 integer
(1 row)

SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
 typlen 
--------
      4
(1 row)

Выражение collation for возвращает правило сортировки для переданного значения. Например:

SELECT collation for (description) FROM pg_description LIMIT 1;
 pg_collation_for 
------------------
 "default"
(1 row)

SELECT collation for ('foo' COLLATE "de_DE");
 pg_collation_for 
------------------
 "de_DE"
(1 row)

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

Функции to_regclass, to_regproc, to_regprocedure, to_regoper, to_regoperator, to_regtype, to_regnamespace и to_regrole преобразуют имена отношений, функций, операторов, типов, схем и ролей (заданных значением text) в объекты типа regclass, regproc, regprocedure, regoper, regoperator, regtype, regnamespace и regrole, соответственно. Перечисленные функции отличаются от явных приведений к этим типам тем, что они не принимают числовые OID и возвращают NULL вместо ошибки, если имя не найдено (или, в случае с to_regproc и to_regoper, если данному имени соответствуют несколько объектов).

В Таблице 9.72 перечислены функции, связанные с идентификацией и адресацией объектов баз данных.

Таблица 9.72. Функции получения информации и адресации объектов

ИмяТип результатаОписание
pg_describe_object(classid oid, objid oid, objsubid integer)textполучает описание объекта базы данных
pg_identify_object(classid oid, objid oid, objsubid integer)type text, schema text, name text, identity textполучает идентификатор объекта базы данных
pg_identify_object_as_address(classid oid, objid oid, objsubid integer)type text, object_names text[], object_args text[]получает внешнее представление адреса объекта базы данных
pg_get_object_address(type text, object_names text[], object_args text[])classid oid, objid oid, objsubid integerполучает адрес объекта базы данных из его внешнего представления

pg_describe_object возвращает текстовое описание объекта БД, идентифицируемого по OID каталога, OID объекта и ID подобъекта (например, номер столбца в таблице; ID подобъекта равен нулю для объекта в целом). Это описание предназначено для человека и может переводиться, в зависимости от конфигурации сервера. С помощью этой функции, например, можно узнать, что за объект хранится в каталоге pg_depend.

pg_identify_object возвращает запись, содержащую достаточно информации для однозначной идентификации объекта БД по OID каталога, OID объекта и ID подобъекта. Эта информация предназначена для машины и поэтому никогда не переводится. Столбец type содержит тип объекта БД; schema — имя схемы, к которой относится объект (либо NULL для объектов, не относящихся к схемам); name — имя объекта, при необходимости в кавычках, которое присутствует, только если оно (возможно, вместе со схемой) однозначно идентифицирует объект (в противном случае NULL); identity — полный идентификатор объекта, точный формат которого зависит от типа объекта, а каждая его часть дополняется схемой и заключается в кавычки, если требуется.

pg_identify_object_as_address возвращает запись, содержащую достаточно информации для однозначной идентификации объекта БД по OID каталога, OID объекта и ID подобъекта. Выдаваемая информация не зависит от текущего сервера, то есть по ней можно идентифицировать одноимённый объект на другом сервере. Поле type содержит тип объекта БД, а object_names и object_args — текстовые массивы, в совокупности формирующие ссылку на объект. Эти три значения можно передать функции pg_get_object_address, чтобы получить внутренний адрес объекта. Данная функция является обратной к pg_get_object_address.

pg_get_object_address возвращает запись, содержащую достаточно информации для уникальной идентификации объекта БД по его типу и массивам имён и аргументов. В ней возвращаются значения, которые используются в системных каталогах, например pg_depend, и могут передаваться в другие системные функции, например pg_identify_object или pg_describe_object. Поле classid содержит OID системного каталога, к которому относится объект; objid — OID самого объекта, а objsubid — идентификатор подобъекта или 0 в случае его отсутствия. Эта функция является обратной к pg_identify_object_as_address.

Функции, перечисленные в Таблице 9.73, извлекают комментарии, заданные для объектов с помощью команды COMMENT. Если найти комментарий для заданных параметров не удаётся, они возвращают NULL.

Таблица 9.73. Функции получения комментариев

ИмяТип результатаОписание
col_description(table_oid, column_number)textполучает комментарий для столбца таблицы
obj_description(object_oid, catalog_name)textполучает комментарий для объекта базы данных
obj_description(object_oid)textполучает комментарий для объекта базы данных (устаревшая форма)
shobj_description(object_oid, catalog_name)textполучает комментарий для разделяемого объекта баз данных

col_description возвращает комментарий для столбца с заданным номером в таблице с указанным OID. (obj_description нельзя использовать для столбцов таблицы, так столбцы не имеют собственных OID.)

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

shobj_description работает подобно obj_description, но она получает комментарии для разделяемых объектов. Некоторые системные каталоги являются глобальными для всех баз данных в кластере и описания объектов в них также хранятся глобально.

Функции, перечисленные в Таблице 9.74, выдают информацию о транзакциях сервера в форме во внешнем представлении. В основном эти функции используются, чтобы определить, какие транзакции были зафиксированы между двумя снимками состояния.

Таблица 9.74. Идентификаторы транзакций и снимков состояния

ИмяТип результатаОписание
txid_current()bigintполучает идентификатор текущей транзакции и присваивает новый, если текущая транзакция его не имеет
txid_current_if_assigned()bigintработает аналогично txid_current(), но возвращает NULL, не присваивая новый идентификатор транзакции, если он ещё не присвоен
txid_current_snapshot()txid_snapshotполучает код текущего снимка
txid_snapshot_xip(txid_snapshot)setof bigintвозвращает идентификаторы выполняющихся транзакций в снимке
txid_snapshot_xmax(txid_snapshot)bigintвозвращает значение xmax для заданного снимка
txid_snapshot_xmin(txid_snapshot)bigintвозвращает значение xmin для заданного снимка
txid_visible_in_snapshot(bigint, txid_snapshot)booleanвидима ли транзакция с указанным идентификатором в данном снимке? (коды подтранзакций не поддерживаются)
txid_status(bigint)textвозвращает состояние заданной транзакции — committed (зафиксирована), aborted (прервана), in progress (выполняется) или NULL, если идентификатор транзакции слишком старый

Внутренний тип идентификаторов транзакций (xid) имеет размер 32 бита, поэтому они повторяются через 4 миллиарда транзакций. Однако эти функции выдают 64-битные значения, дополненные счётчиком «эпохи», так что эти значения останутся уникальными на протяжении всей жизни сервера. Используемый этими функциями тип данных txid_snapshot сохраняет информацию о видимости транзакций в определённый момент времени. Его состав описан в Таблице 9.75.

Таблица 9.75. Состав информации о снимке

ИмяОписание
xminИдентификатор самой ранней транзакции (txid) из активных. Все предыдущие транзакции либо зафиксированы и видимы, либо отменены и мертвы.
xmaxПервый txid из ещё не назначенных. На момент снимка не было запущенных (а значит и видимых) транзакций с идентификатором, большим или равным данному.
xip_listСписок идентификаторов транзакций, активных в момент снимка. Он включает только идентификаторы с номерами от xmin до xmax; хотя уже могут быть транзакции с идентификаторами больше xmax. Если в этом списке не оказывается идентификатора транзакции xmin <= txid < xmax, это означает, что она уже не выполнялась к моменту снимка и, таким образом, видима или мертва, в зависимости от типа завершения. Идентификаторы подтранзакций в этот список не включаются.

В текстовом виде txid_snapshot представляется как xmin:xmax:xip_list. Например, 10:20:10,14,15 означает xmin=10, xmax=20, xip_list=10, 14, 15.

Функция txid_status(bigint) выдаёт состояние фиксации последней транзакции. Проверяя его, приложения могут определить, была ли транзакция зафиксирована или прервана, когда приложение отключается от сервера баз данных в процессе выполнения COMMIT. Состояние транзакции может быть следующим: in progress (выполняется), committed (зафиксирована) и aborted (прервана), если только транзакция не настолько стара, чтобы система удалила информация о её состоянии фиксирования. Если же она так стара, что упоминаний о ней в системе не осталось и информация о фиксации потеряна, эта функция возвращает NULL. Заметьте, что для подготовленных транзакций возвращается состояние in progress; приложения должны проверять pg_prepared_xacts, если им нужно определить, является ли транзакция «txid» подготовленной.

Функции, показанные в Таблице 9.76, выдают информацию об уже зафиксированных транзакциях. Они возвращают полезные данные, только когда включён параметр конфигурации track_commit_timestamp и только для транзакций, зафиксированных после его включения.

Таблица 9.76. Информация о фиксации транзакций

ИмяТип результатаОписание
pg_xact_commit_timestamp(xid)timestamp with time zoneвыдаёт время фиксации транзакции
pg_last_committed_xact()xid xid, timestamp timestamp with time zoneвыдаёт идентификатор и время фиксации транзакции, зафиксированной последней

Функции, перечисленные в Таблице 9.77, выводят свойства, установленные командой initdb, например, версию каталога. Они также выводят сведения о работе журнала предзаписи и контрольных точках. Эта информация относится ко всему кластеру, а не к отдельной базе данных. Данные функции выдают практически всю ту же информацию, и из того же источника, что и pg_controldata, но в форме, более подходящей для функций SQL.

Таблица 9.77. Функции управления данными

ИмяТип результатаОписание
pg_control_checkpoint()recordВозвращает информацию о состоянии текущей контрольной точки.
pg_control_system()recordВозвращает информацию о текущем состоянии управляющего файла.
pg_control_init()recordВозвращает информацию о состоянии инициализации кластера.
pg_control_recovery()recordВозвращает информацию о состоянии восстановления.

Функция pg_control_checkpoint возвращает запись, показанную в Таблице 9.78.

Таблица 9.78. Столбцы результата pg_control_checkpoint

Имя столбцаТип данных
checkpoint_lsnpg_lsn
redo_lsnpg_lsn
redo_wal_filetext
timeline_idinteger
prev_timeline_idinteger
full_page_writesboolean
next_xidtext
next_oidoid
next_multixact_idxid
next_multi_offsetxid
oldest_xidxid
oldest_xid_dbidoid
oldest_active_xidxid
oldest_multi_xidxid
oldest_multi_dbidoid
oldest_commit_ts_xidxid
newest_commit_ts_xidxid
checkpoint_timetimestamp with time zone

Функция pg_control_system возвращает запись, показанную в Таблице 9.79.

Таблица 9.79. Столбцы результата pg_control_system

Имя столбцаТип данных
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

Функция pg_control_init возвращает запись, показанную в Таблице 9.80.

Таблица 9.80. Столбцы результата pg_control_init

Имя столбцаТип данных
max_data_alignmentinteger
database_block_sizeinteger
blocks_per_segmentinteger
wal_block_sizeinteger
bytes_per_wal_segmentinteger
max_identifier_lengthinteger
max_index_columnsinteger
max_toast_chunk_sizeinteger
large_object_chunk_sizeinteger
float4_pass_by_valueboolean
float8_pass_by_valueboolean
data_page_checksum_versioninteger

Функция pg_control_recovery возвращает запись, показанную в Таблице 9.81

Таблица 9.81. Столбцы результата pg_control_recovery

Имя столбцаТип данных
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean