9.26. Системные информационные функции и операторы
В Таблице 9.65 перечислен ряд функций, предназначенных для получения информации о текущем сеансе и системе.
В дополнение к перечисленным здесь функциям существуют также функции, связанные с подсистемой статистики, которые тоже предоставляют системную информацию. Подробнее они рассматриваются в Подразделе 28.2.2.
Таблица 9.65. Функции получения информации о сеансе
Функция Описание |
---|
Выдаёт имя текущей базы данных. (В стандарте SQL базы данных называются «каталогами», поэтому стандарту соответствует написание |
Выдаёт текст запроса, выполняемого в данный момент, в том виде, в каком его передал клиент (может состоять из нескольких операторов). |
Аналог |
Выдаёт имя первой схемы в пути поиска (или значение NULL, если путь поиска пустой). В эту схему будут добавляться таблицы и другие объекты, при создании которых схема не указывается явно. |
Выдаёт массив имён всех схем, в настоящее время представленных в действующем пути поиска, по порядку их приоритета. (Элементы текущего значения search_path, которым не соответствуют существующие схемы, опускаются). Если логический аргумент равен |
Выдаёт имя пользователя в текущем контексте выполнения. |
Выдаёт IP-адрес текущего клиента либо |
Выдаёт номер TCP-порта текущего клиента либо |
Выдаёт IP-адрес, через который сервер принял текущее подключение, либо NULL, если текущее подключение установлено через Unix-сокет. |
Выдаёт номер TCP-порта, через который сервер принял текущее подключение, либо |
Выдаёт идентификатор серверного процесса, обслуживающего текущий сеанс. |
Выдаёт массив с идентификаторами процессов сеансов, которые блокируют серверный процесс с указанным идентификатором, либо пустой массив, если указанный серверный процесс не найден или не заблокирован. Один серверный процесс блокирует другой, если он либо удерживает блокировку, конфликтующую с блокировкой, запрашиваемой вторым (жёсткая блокировка), либо ожидает блокировку, которая вызвала бы конфликт с запросом блокировки заблокированного процесса и находится перед ней в очереди ожидания (мягкая блокировка). При распараллеливании запросов эта функция всегда выдаёт видимые клиентом идентификаторы процессов (то есть, результаты Частые вызовы этой функции могут отразиться на производительности базы данных, так как ей нужен монопольный доступ к общему состоянию менеджера блокировок, пусть и на короткое время. |
Выдаёт время, когда в последний раз сервер загружал файлы конфигурации. (Если текущий сеанс начался раньше, она возвращает время, когда эти файлы были перезагружены для данного сеанса, так что в разных сеансах это значение может немного различаться. В противном случае это будет время, когда файлы конфигурации считал главный процесс.) |
Выдаёт путь к файлу журнала, в настоящее время используемому сборщиком сообщений. Этот путь состоит из пути каталога log_directory и имени конкретного файла. Если сборщик сообщений отключён, выдаётся значение |
Выдаёт OID временной схемы текущего сеанса или 0, если такой схемы нет (в рамках сеанса не создавались временные таблицы). |
Выдаёт true, если заданный OID относится к временной схеме другого сеанса. (Это может быть полезно, например для исключения временных таблиц других сеансов из общего списка при просмотре таблиц базы данных.) |
Выдаёт true, если в данном сеансе доступна JIT-компиляция (см. Главу 32) и параметр конфигурации jit включён. |
Выдаёт список имён каналов асинхронных уведомлений, по которым текущий сеанс принимает сигналы. |
Выдаёт долю (0–1) максимального размера очереди асинхронных уведомлений, в настоящее время занятую уведомлениями, ожидающими обработки. За дополнительными сведениями обратитесь к LISTEN и NOTIFY. |
Выдаёт время, когда был запущен сервер. |
Выдаёт массив с идентификаторами процессов сеансов, которые блокируют серверный процесс с указанным идентификатором, не давая ему получить безопасный снимок, либо выдаёт пустой массив, если такой серверный процесс не найден или он не заблокирован. Сеанс, выполняющий транзакцию уровня Частые вызовы этой функции могут отразиться на производительности сервера, так как ей нужен доступ к общему состоянию менеджера предикатных блокировок, пусть и на короткое время. |
Выдаёт текущий уровень вложенности в триггерах PostgreSQL (0, если эта функция вызывается не из тела триггера, непосредственно или косвенно). |
Выдаёт имя пользователя сеанса. |
Аналог |
Выдаёт текстовую строку, описывающую версию сервера PostgreSQL. Эту информацию также можно получить из переменной server_version или, в более машинно-ориентированном формате, из переменной 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 они не различаются, так как пользователи и роли объединены в единую сущность.)
В Таблице 9.66 показаны функции, позволяющие программно проверить права доступа к объектам. (Подробнее о правах рассказывается в Разделе 5.7.) Этим функциям в качестве идентификатора пользователя, для которого запрашиваются права, можно передать его имя или OID (pg_authid
.oid
), а также можно передать public
(это будет указывать на псевдороль PUBLIC). Кроме того, аргумент user
можно полностью опустить, тогда будет подразумеваться current_user
. Объект, права для доступа к которому запрашиваются, также можно задать по имени или по OID. Когда указывается имя объекта, его можно дополнить именем схемы, если это уместно. Запрашиваемое право записывается текстовой строкой, которая должна задавать одно из прав доступа, соответствующих типу объекта (например, SELECT
). Дополнительно к названию права можно добавить WITH GRANT OPTION
и проверить, разрешено ли пользователю передавать это право другим. Кроме того, в одном параметре можно перечислить несколько прав через запятую, и тогда функция возвратит true
, если пользователь имеет какие-либо из них. (Регистр в названии прав не имеет значения, а между ними (но не внутри) разрешены пробельные символы.) Пара примеров:
SELECT has_table_privilege('myschema.mytable', 'select'); SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
Таблица 9.66. Функции для проверки прав доступа
Функция Описание |
---|
Имеет ли пользователь указанное право для какого-либо столбца таблицы? Ответ положительный, когда он имеет это право для всей таблицы или ему дано соответствующее право на уровне столбцов хотя бы для одного столбца. Возможные права: |
Имеет ли пользователь указанное право для заданного столбца таблицы? Ответ положительный, когда он имеет это право для всей таблицы или ему дано соответствующее право на уровне столбца. Столбец можно задать по имени или номеру атрибута ( |
Имеет ли пользователь указанное право в базе данных? Возможные права: |
Имеет ли пользователь право для обёртки сторонних данных? На данный момент возможно только одно право: |
Имеет ли пользователь право для функции? Возможно единственное право: При указании функции по имени, а не по OID, допускаются те же входные значения, что и для типа SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); |
Имеет ли пользователь право для языка? Возможно единственное право: |
Имеет ли пользователь право для схемы? Возможные права: |
Имеет ли пользователь право для последовательности? Возможные права: |
Имеет ли пользователь право для стороннего сервера? На данный момент возможно только одно право: |
Имеет ли пользователь право для таблицы? Возможные права: |
Имеет ли пользователь право для табличного пространства? Возможно единственное право: |
Имеет ли пользователь право для типа данных? Возможно единственное право: |
Имеет ли пользователь право для роли? Возможные права: |
Действует ли защита на уровне строк для заданной таблицы в контексте текущего пользователя в текущем окружении? |
В Таблице 9.67 показаны операторы, предназначенные для работы с типом aclitem
, который представляет в системном каталоге права доступа. О содержании значений этого типа рассказывается в Разделе 5.7.
Таблица 9.67. Операторы для типа aclitem
В Таблице 9.68 приведены дополнительные функции, предназначенные для работы с типом aclitem
.
Таблица 9.68. Функции для типа aclitem
Функция Описание |
---|
Выдаёт массив с элементами |
Возвращает массив |
Конструирует значение |
В Таблице 9.69 показаны функции, определяющие видимость объекта с текущим путём поиска схем. К примеру, таблица считается видимой, если содержащая её схема включена в путь поиска и нет другой таблицы с тем же именем, которая была бы найдена в этом пути раньше. Другими словами, к этой таблице можно будет обратиться просто по её имени, без явного указания схемы. Просмотреть список всех видимых таблиц можно так:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
Объект, представляющий функцию и оператор, считаются видимым в пути поиска, если при просмотре пути не находится предшествующий ему другой объект с тем же именем и типами аргументов. Для семейств и классов операторов помимо имени объекта во внимание принимается также связанный метод доступа к индексу.
Таблица 9.69. Функции для определения видимости
Всем этим функциям должен передаваться OID проверяемого объекта. Если вы хотите проверить объект по имени, удобнее использовать типы-псевдонимы OID (regclass
, regtype
, regprocedure
, regoperator
, regconfig
или regdictionary
), например:
SELECT pg_type_is_visible('myschema.widget'::regtype);
Заметьте, что проверять таким способом имена без указания схемы не имеет большого смысла — если имя удастся распознать, значит и объект будет видимым.
В Таблице 9.70 перечислены функции, извлекающие информацию из системных каталогов.
Таблица 9.70. Функции для обращения к системным каталогам
Функция Описание |
---|
Выдаёт в формате SQL имя типа данных, определяемого по OID и, возможно, модификатору типа. Если модификатор неизвестен, вместо него можно передать NULL. |
Возвращает набор записей, описывающих отношения внешних ключей, существующие в системных каталогах PostgreSQL. Столбец |
Восстанавливает команду, создающую ограничение. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) |
Декомпилирует внутреннюю форму выражений, находящихся в системных каталогах, например, выражений, задающих значения по умолчанию. Если выражение может содержать Vars (переменные), передайте во втором параметре OID отношения, к которому обращается данное выражение; в противном случае достаточно передать 0. |
Восстанавливает команду, создающую функцию или процедуру. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) В результате выдаётся полноценный оператор |
Восстанавливает список аргументов для функции или процедуры в том виде, в каком он должен задаваться в команде |
Восстанавливает список аргументов, необходимый для однозначной идентификации функции или процедуры, в том виде, в каком он должен задаваться, например в |
Восстанавливает для функции предложение |
Восстанавливает команду, создающую индекс. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) Если передаётся значение |
Выдаёт набор записей, описывающих ключевые слова, которые воспринимает сервер. Столбец |
Восстанавливает команду, создающую правило. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) |
Выдаёт имя последовательности, связанной со столбцом, либо NULL, если такой последовательности нет. Для столбца идентификации это будет последовательность, созданная для него неявно внутри. Для столбцов, имеющих один из последовательных типов ( Обычно эта функция применяется для получения текущего значения последовательности для столбца идентификации или последовательного столбца, например так: SELECT currval(pg_get_serial_sequence('sometable', 'id')); |
Восстанавливает команду, создающую объект расширенной статистики. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) |
Восстанавливает команду, создающую триггер. (Текст команды не является изначальным, он восстанавливается путём декомпиляции.) |
Выдаёт имя роли по заданному OID. |
Восстанавливает команду |
Восстанавливает команду |
Восстанавливает команду |
Проверяет, имеет ли столбец индекса заданное свойство. Типичные свойства столбцов описаны в Таблице 9.71. (Заметьте, что расширенные методы доступа могут определять для своих индексов дополнительные свойства.) Если заданное имя свойства не известно или не применимо к конкретному объекту, либо если OID или номер столбца не указывают на существующий объект, эта функция возвращает |
Проверяет, имеет ли индекс заданное свойство. Типичные свойства индексов описаны в Таблице 9.71. (Заметьте, что расширенные методы доступа могут определять для своих индексов дополнительные свойства.) Если заданное имя свойства не известно или не применимо к конкретному объекту, либо если OID не указывает на существующий объект, эта функция возвращает |
Проверяет, имеет ли метод доступа индекса заданное свойство. Свойства методов доступа описаны в Таблице 9.73. Если заданное имя свойства неизвестно или не применимо к конкретному объекту, либо если OID не указывает на существующий объект, эта функция возвращает |
Выдаёт набор параметров хранилища, представленных значением из |
Выдаёт набор OID баз данных, объекты которых размещены в заданном табличном пространстве. Если эта функция возвращает строки, это означает, что табличное пространство не пустое и удалить его нельзя. Какие именно объекты находятся в табличном пространстве, можно определить, подключаясь к базам данных, OID которых сообщила |
Выдаёт путь в файловой системе к местоположению заданного табличного пространства. |
Выдаёт OID типа данных для переданного значения. Это может быть полезно для разрешения проблем или динамического создания SQL-запросов. Эта функция объявлена как возвращающая тип Пример: SELECT pg_typeof(33); pg_typeof ----------- integer SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); typlen -------- 4 |
Выдаёт имя правила сортировки для переданного значения. Это значение может быть заключено в кавычки и дополнено схемой. Если с выражением аргумента не связано правило сортировки, возвращается Пример: SELECT collation for (description) FROM pg_description LIMIT 1; pg_collation_for ------------------ "default" SELECT collation for ('foo' COLLATE "de_DE"); pg_collation_for ------------------ "de_DE" |
Переводит в OID текстовое имя отношения. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя правила сортировки. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя схемы. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя оператора. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя оператора с указанием типов параметров. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя функции или процедуры. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя функции или процедуры с указанием типов аргументов. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя роли. Подобный результат можно получить, приведя строку с именем к типу |
Переводит в OID текстовое имя типа. Подобный результат можно получить, приведя строку с именем к типу |
Многие из функций, восстанавливающих (декомпилирующих) объекты БД, принимают дополнительный флаг pretty
, в котором можно передать true
для визуального улучшения вывода. При этом будут убраны лишние скобки и добавлены пробельные символы, чтобы текст был более разборчивым. Преобразованный вывод легче читается, но формат по умолчанию с большей вероятностью будет успешно восприниматься будущими версиями PostgreSQL, поэтому для выгрузки содержимого БД рекомендуется избегать использования визуально улучшенного формата. Если параметр pretty
равен false
, это равнозначно его отсутствию.
Таблица 9.71. Свойства столбца индекса
Имя | Описание |
---|---|
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.72. Свойства индекса
Имя | Описание |
---|---|
clusterable | Может ли индекс использоваться в команде CLUSTER ? |
index_scan | Поддерживает ли индекс простое сканирование (не по битовой карте)? |
bitmap_scan | Поддерживает ли индекс сканирование по битовой карте? |
backward_scan | Может ли в процессе сканирования меняться направление (для поддержки перемещения курсора FETCH BACKWARD без необходимости материализации)? |
Таблица 9.73. Свойства метода доступа индекса
Имя | Описание |
---|---|
can_order | Поддерживает ли метод доступа ASC , DESC и связанные ключевые слова в CREATE INDEX ? |
can_unique | Поддерживает ли метод доступа уникальные индексы? |
can_multi_col | Поддерживает ли метод доступа индексы по нескольким столбцам? |
can_exclude | Поддерживает ли метод доступа ограничения-исключения? |
can_include | Поддерживает ли метод доступа предложение INCLUDE команды CREATE INDEX ? |
В Таблице 9.74 перечислены функции, связанные с идентификацией и адресацией объектов баз данных.
Таблица 9.74. Функции получения информации и адресации объектов
Функции, перечисленные в Таблице 9.75, извлекают комментарии, заданные для объектов с помощью команды COMMENT. Если найти комментарий для заданных параметров не удаётся, они возвращают NULL.
Таблица 9.75. Функции получения комментариев
Функции, показанные в Таблице 9.76, выдают информацию о транзакциях сервера в виде, подходящем для экспорта. В основном эти функции используются, чтобы определить, какие транзакции были зафиксированы между двумя снимками состояния.
Таблица 9.76. Функции получения информации об идентификаторах транзакций и снимках состояния
Функция Описание |
---|
Выдаёт идентификатор текущей транзакции. Если у текущей транзакции ещё нет идентификатора (она не успела выполнить какие-либо изменения в базе), он будет ей назначен. |
Выдаёт идентификатор текущей транзакции или |
Выдаёт состояние фиксации транзакции. Результатом будет одно из значений: |
Возвращает текущий снимок состояния — структуру данных, показывающую, какие транзакции выполняются в момент снимка. |
Выдаёт набор идентификаторов выполняющихся транзакций, содержащихся в снимке. |
Выдаёт значение |
Выдаёт |
Видна ли транзакция с указанным идентификатором в данном снимке (то есть, была ли она завершена до момента получения снимка)? Заметьте, что эта функция не выдаст правильный ответ, если ей передать идентификатор подтранзакции. |
Внутренний тип идентификаторов транзакций, xid
, имеет размер 32 бита и значения в нём повторяются через каждые 4 миллиарда транзакций. Однако функции, показанные в Таблице 9.76 используют 64-битный тип xid8
, значения которого не повторяются на протяжении всей жизни сервера и могут быть приведены к типу xid
, если требуется. Тип данных pg_snapshot
содержит информацию о видимости транзакций в определённый момент времени. Его компоненты описаны в Таблице 9.77. В текстовом виде pg_snapshot
представляется как
. Например, запись xmin
:xmax
:список_xip
10:20:10,14,15
обозначает xmin=10, xmax=20, xip_list=10, 14, 15
.
Таблица 9.77. Состав информации о снимке
Имя | Описание |
---|---|
xmin | Минимальный идентификатор транзакции среди всех активных. Все транзакции, идентификаторы которых меньше xmin , уже либо зафиксированы и видимы, либо отменены и «мертвы». |
xmax | Идентификатор на один больше идентификатора последней завершённой транзакции. Все транзакции, идентификаторы которых больше или равны xmax , на момент получения снимка ещё не завершены и не являются видимыми. |
xip_list | Транзакции, выполняющиеся в момент получения снимка. Транзакции с такими идентификаторами, для которых xmin <= , не попавшие в этот список, были уже завершены на момент получения снимка, и поэтому либо видимы, либо «мертвы», в зависимости от варианта завершения. Идентификаторы подтранзакций в этот список не включаются. |
До 13 версии в PostgreSQL отсутствовал тип xid8
, поэтому предлагались вариации этих функций, в которых 64-битные XID представлялись в типе bigint
, а для информации о снимке использовался отдельный тип txid_snapshot
. В названиях этих старых функций фигурирует txid
. Они по-прежнему поддерживаются для обратной совместимости, но могут быть удалены в будущем. См. Таблицу 9.78.
Таблица 9.78. Устаревшие функции получения информации об идентификаторах транзакций и снимках состояния
Функции, показанные в Таблице 9.79, выдают информацию о времени фиксирования уже завершённых транзакций. Полезным результат этих функций будет, только когда включён параметр конфигурации track_commit_timestamp и только для транзакций, зафиксированных после его включения.
Таблица 9.79. Функции получения информации о фиксации транзакций
Функции, показанные в Таблице 9.80, выдают информацию, записываемую во время initdb
, например, версию каталога. Они также выводят сведения о журнале предзаписи и контрольных точках. Эта информация относится ко всему кластеру, а не к отдельной базе. Данные функции выдают практически ту же информацию, и из того же источника, что и pg_controldata.
Таблица 9.80. Функции управления данными
Функция Описание |
---|
Выдаёт информацию о текущем состоянии контрольных точек, показанную в Таблице 9.81. |
Выдаёт информацию о текущем состоянии управляющего файла, показанную в Таблице 9.82. |
Выдаёт информацию о состоянии инициализации кластера, показанную в Таблице 9.83. |
Выдаёт информацию о состоянии восстановления, как показано в Таблице 9.84. |
Таблица 9.81. Столбцы результата pg_control_checkpoint
Имя столбца | Тип данных |
---|---|
checkpoint_lsn | pg_lsn |
redo_lsn | pg_lsn |
redo_wal_file | text |
timeline_id | integer |
prev_timeline_id | integer |
full_page_writes | boolean |
next_xid | text |
next_oid | oid |
next_multixact_id | xid |
next_multi_offset | xid |
oldest_xid | xid |
oldest_xid_dbid | oid |
oldest_active_xid | xid |
oldest_multi_xid | xid |
oldest_multi_dbid | oid |
oldest_commit_ts_xid | xid |
newest_commit_ts_xid | xid |
checkpoint_time | timestamp with time zone |
Таблица 9.82. Столбцы результата pg_control_system
Имя столбца | Тип данных |
---|---|
pg_control_version | integer |
catalog_version_no | integer |
system_identifier | bigint |
pg_control_last_modified | timestamp with time zone |
Таблица 9.83. Столбцы результата pg_control_init
Имя столбца | Тип данных |
---|---|
max_data_alignment | integer |
database_block_size | integer |
blocks_per_segment | integer |
wal_block_size | integer |
bytes_per_wal_segment | integer |
max_identifier_length | integer |
max_index_columns | integer |
max_toast_chunk_size | integer |
large_object_chunk_size | integer |
float8_pass_by_value | boolean |
data_page_checksum_version | integer |
Таблица 9.84. Столбцы результата pg_control_recovery
Имя столбца | Тип данных |
---|---|
min_recovery_end_lsn | pg_lsn |
min_recovery_end_timeline | integer |
backup_start_lsn | pg_lsn |
backup_end_lsn | pg_lsn |
end_of_backup_record_required | boolean |