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

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

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

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

ИмяТип результатаОписание
current_catalog nameимя текущей базы данных (в стандарте SQL она называется "каталогом")
current_database() nameимя текущей базы данных
current_query() textтекст запроса, выполняемого в данный момент, в том виде, в каком его передал клиент (может состоять из нескольких операторов)
current_schema[()]nameимя текущей схемы
current_schemas(boolean) name[]имена схем в пути поиска, возможно включая схемы, добавляемые в него неявно
current_user nameимя пользователя в текущем контексте выполнения
inet_client_addr() inetадрес удалённой стороны соединения
inet_client_port() intпорт удалённой стороны соединения
inet_server_addr() inetадрес локальной стороны соединения
inet_server_port() intпорт локальной стороны соединения
pg_backend_pid() intкод серверного процесса, обслуживающего текущий сеанс
pg_conf_load_time() timestamp with time zoneвремя загрузки конфигурации
pg_is_other_temp_schema(oid) booleanявляется ли заданная схема временной в другом сеансе?
pg_listening_channels() setof textимена каналов, по которым текущий сеанс принимает сигналы
pg_my_temp_schema() oidOID временной схемы этого сеанса или 0, если её нет
pg_postmaster_start_time() timestamp with time zoneвремя запуска сервера
pg_trigger_depth() intтекущий уровень вложенности в триггерах PostgreSQL (0, если эта функция вызывается (прямо или косвенно) не из тела триггера)
session_user nameимя пользователя сеанса
user nameсиноним current_user
version() textинформация о версии PostgreSQL

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

Функция session_user обычно возвращает имя пользователя, установившего текущее соединение с базой данных, но суперпользователи могут изменить это имя, выполнив команду SET SESSION AUTHORIZATION. Функция current_user возвращает идентификатор пользователя, по которому будут проверяться его права. Обычно это тот же пользователь, что и пользователь сеанса, но его можно сменить с помощью SET ROLE. Этот идентификатор также меняется при выполнении функций с атрибутом SECURITY DEFINER. На языке Unix пользователь сеанса называется "реальным", а текущий — "эффективным".

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

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

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

pg_listening_channels возвращает имена каналов, по которым текущий сеанс принимает сигналы. Подробнее это освещается в описании команды LISTEN.

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

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

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

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

version возвращает строку, описывающую версию сервера PostgreSQL.

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

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

ИмяТип результатаОписание
has_any_column_privilege(user, table, privilege)booleanимеет ли пользователь указанное право для какой-либо колонки таблицы
has_any_column_privilege(table, privilege)booleanимеет ли текущий пользователь указанное право для какой-либо колонки таблицы
has_column_privilege(user, table, column, privilege)booleanимеет ли пользователь указанное право для колонки
has_column_privilege(table, column, privilege)booleanимеет ли текущий пользователь указанное право для колонки
has_database_privilege(user, база данных, privilege)booleanимеет ли пользователь указанное право для базы данных
has_database_privilege(база данных, 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, table, privilege)booleanимеет ли пользователь указанное право для таблицы
has_table_privilege(table, privilege)booleanимеет ли текущий пользователь указанное право для таблицы
has_tablespace_privilege(user, tablespace, privilege)booleanимеет ли пользователь указанное право для табличного пространства
has_tablespace_privilege(tablespace, privilege)booleanимеет ли текущий пользователь указанное право для табличного пространства
pg_has_role(user, role, privilege)booleanимеет ли пользователь указанное право для роли
pg_has_role(role, privilege)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.18). Для этой функции допустимо только право 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.

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

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

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

ИмяТип результатаОписание
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_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_type_is_visible можно использовать и для доменов. Для функций и операторов объект считается видимым в пути поиска, если при просмотре пути не находится предшествующий ему другой объект с тем же именем и типами аргументов. Для классов операторов во внимание принимается и имя оператора, и связанный с ним метод доступа к индексу.

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

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

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

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

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

ИмяТип результатаОписание
format_type(type_oid, typemod) textполучает имя типа данных в формате SQL
pg_describe_object(catalog_id, object_id, object_sub_id) textполучает описание объекта базы данных
pg_identify_object(catalog_id oid, object_id oid, object_sub_id integer) type text, schema text, name text, identity textполучает идентификатор объекта базы данных
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 для функции
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, smallserial или bigserial
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_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 указанного типа

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_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, если такой последовательности нет. В первом параметре функции указывается имя таблицы, возможно дополненное схемой, а во втором имя колонки. Так как первый параметр может содержать имя схемы и таблицы, он воспринимается не как идентификатор в кавычках и поэтому по умолчанию приводится к нижнему регистру, тогда как имя колонки воспринимается как заключённое в кавычки и в нём регистр символов сохраняется. Это функция возвращает имя в виде, пригодном для передачи функциям, работающим с последовательностями (см. Раздел 9.16). Связь последовательности с колонкой можно изменить или удалить с помощью команды ALTER SEQUENCE OWNED BY. (Данную функцию можно было бы назвать pg_get_owned_sequence; настоящее её имя отражает то, что она обычно используется с колонками serial и bigserial.)

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

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

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

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

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

pg_typeof возвращает OID типа данных для переданного значения. Это может быть полезно для разрешения проблем или динамического создания SQL-запросов. Эта функция объявлена как возвращающая тип regtype, который является псевдонимом типа OID (см. Раздел 8.18); это означает, что значение этого типа можно сравнивать как 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 преобразуют имена отношений, функций, операторов и типов в объекты типа regclass, regproc, regprocedure, regoper, regoperator и regtype, соответственно. Перечисленные функции отличаются от явных приведений к этим типам тем, что они не принимают числовые OID и возвращают NULL, вместо того, чтобы генерировать ошибку, если имя не найдено (или, в случае с to_regproc и to_regoper, если данному имени соответствуют несколько объектов).

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

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

ИмяТип результатаОписание
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-61, выдают информацию о транзакциях сервера в форме во внешнем представлении. В основном эти функции используются, чтобы определить, какие транзакции были зафиксированы между двумя снимками состояния.

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

ИмяТип результатаОписание
txid_current() bigintполучает идентификатор текущей транзакции
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видима ли транзакция с указанным идентификатором в данном снимке? (коды подтранзакций не поддерживаются)

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

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

ИмяОписание
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.