F.18. file_fdw
Модуль file_fdw
реализует обёртку сторонних данных file_fdw
для доступа к файлам на сервере. Файлы должны быть в формате, который понимает команда COPY FROM
; он рассматривается в описании COPY. В настоящий момент файлы доступны только для чтения.
Для сторонней таблицы, создаваемой через эту обёртку, можно задать следующие параметры:
filename
Имя файла данных. Указывается обязательно. При указании относительного пути он рассматривается от каталога данных.
format
Формат файла. Аналогично указанию
FORMAT
в командеCOPY
.header
Показывает, что файл содержит строку заголовка с именами столбцов. Аналогично указанию
HEADER
в командеCOPY
.delimiter
Задаёт символ, разделяющий столбцы в строках файла. Аналогично указанию
DELIMITER
в командеCOPY
.quote
Задаёт символ, используемый для заключения данных в кавычки. Аналогично указанию
QUOTE
в командеCOPY
.escape
Задаёт символ, который будет выводиться перед символом данных, совпавшим со значением
QUOTE
. Аналогично указаниюESCAPE
в командеCOPY
.null
Определяет строку, задающую значение
NULL
. Аналогично указаниюNULL
в командеCOPY
.encoding
Задаёт кодировку файла. Аналогично указанию
ENCODING
в командеCOPY
.
Заметьте, что хотя COPY
принимает указания, такие как OIDS и HEADER, без соответствующего значения, синтаксис обёртки сторонних данных требует, чтобы значение присутствовало во всех случаях. Чтобы активировать указания COPY
, которым значение обычно не передаётся, им можно просто передать значение TRUE.
Для столбцов сторонней таблицы, создаваемой через эту обёртку, можно задать следующие параметры:
force_not_null
Логическое значение. Если true, то значение столбца не должно сверяться со значением NULL (заданным в параметре
null
). Аналогично включению столбца в список указанияFORCE_NOT_NULL
командыCOPY
.force_null
Логическое значение. Если true, значения столбцов нужно сверять со значением NULL (заданным в параметре
NULL
), даже если они заключены в кавычки. Без этого параметра только значения без кавычек, соответствующие значениюnull
, будут возвращаться как NULL. Аналогично включению столбца в список указанияFORCE_NULL
командыCOPY
.
В настоящий момент file_fdw
не поддерживает указания OIDS
и FORCE_QUOTE
команды COPY
.
Перечисленные параметры применимы только для сторонних таблиц или их столбцов. Их нельзя указать для обёртки сторонних данных file_fdw
, серверов или сопоставлений пользователей, использующих эту обёртку.
Для изменения параметров, определяемых для таблицы, требуются права суперпользователя. Это сделано в целях безопасности: только суперпользователь должен решать, какой файл использовать. В принципе, доступ на изменение остальных параметров можно предоставить и не суперпользователям, но в настоящий момент это не реализовано.
Для сторонних таблиц, работающих через file_fdw
, команда EXPLAIN
показывает имя используемого файла. Если не указывать COSTS OFF
, то выводится и размер файла (в байтах).
Пример F.1. Создание сторонней таблицы для журнала сервера Postgres Pro
Одно из очевидных применений file_fdw
— это предоставление доступа к журналу сообщений Postgres Pro как к таблице. Для этого необходимо предварительно настроить вывод сообщений в файл CSV (дальше мы будем считать, что это файл pglog.csv
). Сначала установите расширение file_fdw
:
CREATE EXTENSION file_fdw;
Затем создайте сторонний сервер:
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
Всё готово для создания сторонней таблицы. В команде CREATE FOREIGN TABLE
нужно перечислить столбцы таблицы, указать файл CSV и его формат:
CREATE FOREIGN TABLE pglog ( log_time timestamp(3) with time zone, user_name text, database_name text, process_id integer, connection_from text, session_id text, session_line_num bigint, command_tag text, session_start_time timestamp with time zone, virtual_transaction_id text, transaction_id bigint, error_severity text, sql_state_code text, message text, detail text, hint text, internal_query text, internal_query_pos integer, context text, query text, query_pos integer, location text, application_name text ) SERVER pglog OPTIONS ( filename '/home/josh/9.1/data/pg_log/pglog.csv', format 'csv' );
Вот и всё. Теперь для просмотра журнала сервера можно просто выполнять запросы к таблице. В производственной среде, разумеется, ещё потребуется как-то учесть ротацию файлов журнала.