F.15. file_fdw — обращение к файлам данных в файловой системе сервера #
Модуль file_fdw
реализует обёртку сторонних данных file_fdw
, с помощью которой можно обращаться к файлам данных в файловой системе сервера или выполнять программы на сервере и читать их вывод. Файлы и вывод программ должны быть в формате, который понимает команда COPY FROM
; он рассматривается в описании COPY. В настоящее время файлы доступны только для чтения.
Для сторонней таблицы, создаваемой через эту обёртку, можно задать следующие параметры:
filename
Определяет имя файла, который нужно прочитать. При указании относительного пути он рассматривается от каталога данных. Вы должны определить либо параметр
filename
, либоprogram
, но не оба сразу.program
Определяет команду, которая будет выполнена. Поток стандартного вывода этой команды будет прочитан так же, как и с
COPY FROM PROGRAM
. Необходимо определить либо параметрprogram
, либоfilename
, но не оба сразу.format
Определяет формат файла (аналогично указанию
FORMAT
в командеCOPY
).header
Указывает, что данные содержат строку заголовка с именами столбцов (аналогично указанию
HEADER
в командеCOPY
).delimiter
Задаёт символ, разделяющий столбцы в данных (аналогично указанию
DELIMITER
в командеCOPY
).quote
Задаёт символ, используемый для заключения данных в кавычки (аналогично указанию
QUOTE
в командеCOPY
).escape
Задаёт символ, используемый для экранирования данных (аналогично указанию
ESCAPE
в командеCOPY
).null
Определяет строку, задающую значение
NULL
в данных (аналогично указаниюNULL
в командеCOPY
).encoding
Задаёт кодировку данных (аналогично указанию
ENCODING
в командеCOPY
).
Заметьте, что хотя COPY
принимает указания, такие как 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
не поддерживает указание FORCE_QUOTE
команды COPY
.
Перечисленные параметры применимы только для сторонних таблиц или их столбцов. Их нельзя указать для обёртки сторонних данных file_fdw
, серверов или сопоставлений пользователей, использующих эту обёртку.
Для изменения параметров, определяемых для таблицы, требуется быть суперпользователем или иметь права роли pg_read_server_files
(для указания имени файла) или роли pg_execute_server_program
(для указания программы). Это сделано в целях безопасности: только избранные пользователи должны выбирать, какой файл читать или какую программу запускать. В принципе право изменения остальных параметров можно предоставить и обычным пользователям, но в настоящий момент это не реализовано.
Задавая параметр program
, помните, что эта строка выполняется оболочкой ОС. Если вы хотите передавать заданной команде параметры из недоверенного источника, позаботьтесь об исключении или экранировании всех символов, которые могут иметь особое назначение в оболочке. По соображениям безопасности лучше, чтобы эта командная строка была фиксированной или как минимум в ней не передавались данные, поступающие от пользователя.
Для сторонних таблиц, работающих через file_fdw
, команда EXPLAIN
показывает имя используемого файла или запускаемой программы. Если не указывать COSTS OFF
, то выводится и размер файла (в байтах).
Пример F.1. Создание сторонней таблицы для журнала сервера PostgreSQL
Одно из очевидных применений file_fdw
— это предоставление доступа к журналу сообщений PostgreSQL как к таблице. Для этого необходимо предварительно настроить вывод сообщений в файл 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, backend_type text, leader_pid integer, query_id bigint ) SERVER pglog OPTIONS ( filename 'log/pglog.csv', format 'csv' );
Вот и всё. Теперь для просмотра журнала сервера можно просто выполнять запросы к таблице. В производственной среде, разумеется, ещё потребуется как-то учесть ротацию файлов журнала.
Пример F.2. Создать внешнюю таблицу с параметром для столбца
Чтобы задать параметр force_null
для столбца, используйте ключевое слово OPTIONS
.
CREATE FOREIGN TABLE films ( code char(5) NOT NULL, title text NOT NULL, rating text OPTIONS (force_null 'true') ) SERVER film_server OPTIONS ( filename 'films/db.csv', format 'csv' );