E.14. 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, то выводится и размер файла (в байтах).

Пример E-1. Создание сторонней таблицы для журнала сервера PostgreSQL

Одно из очевидных применений file_fdw это предоставление доступа к журналу сервера как к таблице. Предварительно нужно убедиться, что журнал сервера пишется в формате 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' );

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