9.25. Системные информационные функции и операторы
В Таблице 9.63 перечислен ряд функций, предназначенных для получения информации о текущем сеансе и системе.
В дополнение к перечисленным здесь функциям существуют также функции, связанные с подсистемой статистики, которые тоже предоставляют системную информацию. Подробнее они рассматриваются в Подразделе 27.2.2.
Таблица 9.63. Функции получения информации о сеансе
Имя | Тип результата | Описание |
---|---|---|
| name | имя текущей базы данных (в стандарте SQL она называется «каталогом») |
| name | имя текущей базы данных |
| text | текст запроса, выполняемого в данный момент, в том виде, в каком его передал клиент (может состоять из нескольких операторов) |
| name | синоним current_user |
| name | имя текущей схемы |
| name[] | имена схем в пути поиска, возможно включая схемы, добавляемые в него неявно |
| name | имя пользователя в текущем контексте выполнения |
| inet | адрес удалённой стороны соединения |
| int | порт удалённой стороны соединения |
| inet | адрес локальной стороны соединения |
| int | порт локальной стороны соединения |
| int | код серверного процесса, обслуживающего текущий сеанс |
| int[] | идентификаторы процессов, не дающих серверному процессу с определённым ID получить блокировку |
| timestamp with time zone | время загрузки конфигурации |
| text | имя файла главного журнала или журнала в заданном формате, который в настоящее время используется сборщиком сообщений |
| oid | OID временной схемы этого сеанса или 0, если её нет |
| boolean | является ли заданная схема временной в другом сеансе? |
| boolean | true , если в данном сеансе доступна JIT-компиляция (см. Главу 31) и параметр конфигурации jit включён. |
| setof text | имена каналов, по которым текущий сеанс принимает сигналы |
| double | занятая доля очереди асинхронных уведомлений (0-1) |
| timestamp with time zone | время запуска сервера |
| int[] | Идентификаторы процессов, не дающих серверному процессу с определённым ID получить безопасный снимок |
| int | текущий уровень вложенности в триггерах PostgreSQL (0, если эта функция вызывается (прямо или косвенно) не из тела триггера) |
| name | имя пользователя сеанса |
| name | синоним current_user |
| 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. Функции для проверки прав доступа
Имя | Тип результата | Описание |
---|---|---|
| boolean | имеет ли пользователь указанное право для какого-либо столбца таблицы |
| boolean | имеет ли текущий пользователь указанное право для какого-либо столбца таблицы |
| boolean | имеет ли пользователь указанное право для столбца |
| boolean | имеет ли текущий пользователь указанное право для столбца |
| boolean | имеет ли пользователь указанное право для базы данных |
| boolean | имеет ли текущий пользователь указанное право для базы данных |
| boolean | имеет ли пользователь указанное право для обёртки сторонних данных |
| boolean | имеет ли текущий пользователь указанное право для обёртки сторонних данных |
| boolean | имеет ли пользователь указанное право для функции |
| boolean | имеет ли текущий пользователь указанное право для функции |
| boolean | имеет ли пользователь указанное право для языка |
| boolean | имеет ли текущий пользователь указанное право для языка |
| boolean | имеет ли пользователь указанное право для схемы |
| boolean | имеет ли текущий пользователь указанное право для схемы |
| boolean | имеет ли пользователь указанное право для последовательности |
| boolean | имеет ли текущий пользователь указанное право для последовательности |
| boolean | имеет ли пользователь указанное право для стороннего сервера |
| boolean | имеет ли текущий пользователь указанное право для стороннего сервера |
| boolean | имеет ли пользователь указанное право для таблицы |
| boolean | имеет ли текущий пользователь указанное право для таблицы |
| boolean | имеет ли пользователь указанное право для табличного пространства |
| boolean | имеет ли текущий пользователь указанное право для табличного пространства |
| boolean | имеет ли пользователь указанное право для типа |
| boolean | имеет ли текущий пользователь указанное право для типа |
| boolean | имеет ли пользователь указанное право для роли |
| boolean | имеет ли текущий пользователь указанное право для роли |
| 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
.
row_security_active
проверяет, включена ли защита на уровне строк для указанной таблицы в контексте и окружении текущего пользователя (current_user
). Таблицу можно задать по имени или OID.
В Таблице 9.65 показаны операторы, предназначенные для работы с типом aclitem
, который представляет в системном каталоге права доступа. О содержании значений этого типа рассказывается в Разделе 5.7.
Таблица 9.65. Операторы для типа aclitem
Оператор | Описание | Пример | Результат |
---|---|---|---|
= | равно | 'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem | f |
@> | содержит элемент | '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*w/hobbes'::aclitem | t |
~ | содержит элемент | '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*w/hobbes'::aclitem | t |
В Таблице 9.66 приведены дополнительные функции, предназначенные для работы с типом aclitem
.
Таблица 9.66. Функции для типа aclitem
Имя | Тип результата | Описание |
---|---|---|
| aclitem[] | выдаёт права доступа по умолчанию, назначенные объектам, которые принадлежат роли ownerId |
| setof record | выдаёт массив aclitem в виде кортежей |
| 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. Функции для определения видимости
Имя | Тип результата | Описание |
---|---|---|
| boolean | видимо ли правило сортировки |
| boolean | видимо ли преобразование |
| boolean | видима ли функция |
| boolean | видим ли класс операторов |
| boolean | видим ли оператор |
| boolean | видимо ли семейство операторов |
| boolean | видим ли объект статистики в пути поиска |
| boolean | видима ли таблица |
| boolean | видима ли конфигурация текстового поиска |
| boolean | видим ли словарь текстового поиска |
| boolean | видим ли анализатор текстового поиска |
| boolean | видим ли шаблон текстового поиска |
| 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. Функции для обращения к системным каталогам
Имя | Тип результата | Описание |
---|---|---|
| text | получает имя типа данных в формате SQL |
| text | получает определение ограничения |
| text | получает определение ограничения |
| text | декомпилирует внутреннюю форму выражения, в предположении, что все переменные в нём ссылаются на таблицу или отношение, указанное вторым параметром |
| text | декомпилирует внутреннюю форму выражения, в предположении, что все переменные в нём ссылаются на таблицу или отношение, указанное вторым параметром |
| text | получает определение функции или процедуры |
| text | получает список аргументов из определения функции или процедуры (со значениями по умолчанию) |
| text | получает список аргументов, идентифицирующий функцию или процедуру (без значений по умолчанию) |
| text | получает предложение RETURNS для функции (для процедуры возвращает NULL) |
| text | получает команду CREATE INDEX для индекса |
| text | получает команду CREATE INDEX для индекса или определение одного индексированного столбца, когда column_no не равен 0 |
| setof record | получает список ключевых слов SQL по категориям |
| text | получает команду CREATE RULE для правила |
| text | получает команду CREATE RULE для правила |
| text | получает имя последовательности, используемой столбцом идентификации или столбцом serial |
| text | получает команду CREATE STATISTICS для объекта расширенной статистики |
pg_get_triggerdef (trigger_oid ) | text | получает команду CREATE [ CONSTRAINT ] TRIGGER для триггера |
pg_get_triggerdef (trigger_oid , pretty_bool ) | text | получает команду CREATE [ CONSTRAINT ] TRIGGER для триггера |
| name | получает имя роли по заданному OID |
| text | получает команду SELECT , определяющую представление или материализованное представление (устаревшая функция) |
| text | получает команду SELECT , определяющую представление или материализованное представление (устаревшая функция) |
| text | получает команду SELECT , определяющую представление или материализованное представление |
| text | получает команду SELECT , определяющую представление или материализованное представление |
| text | получает команду SELECT , определяющую представление или материализованное представление; при необходимости разбивает строки с полями, выходящие за wrap_int символов, подразумевая форматированный вывод |
| boolean | проверяет, имеет ли столбец индекса заданное свойство |
| boolean | проверяет, имеет ли индекс заданное свойство |
| boolean | проверяет, имеет ли метод доступа индекса заданное свойство |
| setof record | получает набор параметров хранилища в виде имя/значение |
| setof oid | получает или устанавливает OID баз данных, объекты которых содержатся в заданном табличном пространстве |
| text | получает путь в файловой системе к местоположению заданного табличного пространства |
| regtype | получает тип данных любого значения |
| text | получает правило сортировки для аргумента |
| regclass | получает OID указанного отношения |
| regproc | получает OID указанной функции |
| regprocedure | получает OID указанной функции |
| regoper | получает OID указанного оператора |
| regoperator | получает OID указанного оператора |
| regtype | получает OID указанного типа |
| regnamespace | получает OID указанной схемы |
| 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. Функции получения информации и адресации объектов
Имя | Тип результата | Описание |
---|---|---|
| text | получает описание объекта базы данных |
| type text , schema text , name text , identity text | получает идентификатор объекта базы данных |
| 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. Функции получения комментариев
Имя | Тип результата | Описание |
---|---|---|
| text | получает комментарий для столбца таблицы |
| text | получает комментарий для объекта базы данных |
| text | получает комментарий для объекта базы данных (устаревшая форма) |
| 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. Идентификаторы транзакций и снимков состояния
Имя | Тип результата | Описание |
---|---|---|
| bigint | получает идентификатор текущей транзакции и присваивает новый, если текущая транзакция его не имеет |
| bigint | работает аналогично txid_current() , но возвращает NULL, не присваивая новый идентификатор транзакции, если он ещё не присвоен |
| txid_snapshot | получает код текущего снимка |
| setof bigint | возвращает идентификаторы выполняющихся транзакций в снимке |
| bigint | возвращает значение xmax для заданного снимка |
| bigint | возвращает значение xmin для заданного снимка |
| boolean | видима ли транзакция с указанным идентификатором в данном снимке? (коды подтранзакций не поддерживаются) |
| 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. Информация о фиксации транзакций
Функции, перечисленные в Таблице 9.77, выводят свойства, установленные командой initdb
, например, версию каталога. Они также выводят сведения о работе журнала предзаписи и контрольных точках. Эта информация относится ко всему кластеру, а не к отдельной базе данных. Данные функции выдают практически всю ту же информацию, и из того же источника, что и pg_controldata, но в форме, более подходящей для функций SQL.
Таблица 9.77. Функции управления данными
Функция pg_control_checkpoint
возвращает запись, показанную в Таблице 9.78.
Таблица 9.78. Столбцы результата 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 |
Функция pg_control_system
возвращает запись, показанную в Таблице 9.79.
Таблица 9.79. Столбцы результата pg_control_system
Имя столбца | Тип данных |
---|---|
pg_control_version | integer |
catalog_version_no | integer |
system_identifier | bigint |
pg_control_last_modified | timestamp with time zone |
Функция pg_control_init
возвращает запись, показанную в Таблице 9.80.
Таблица 9.80. Столбцы результата 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 |
float4_pass_by_value | boolean |
float8_pass_by_value | boolean |
data_page_checksum_version | integer |
Функция pg_control_recovery
возвращает запись, показанную в Таблице 9.81
Таблица 9.81. Столбцы результата 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 |