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 команды COPY.

encoding
Задает кодировку данных аналогично параметру ENCODING команды COPY.

Обратите внимание, что хотя COPY принимает параметры, такие как HEADER, без соответствующего значения, синтаксис обертки сторонних данных требует, чтобы значение присутствовало во всех случаях. Для активации параметров COPY, которые обычно записываются без значения, им можно просто передать значение TRUE, так как все они являются логическими.

Для столбцов сторонней таблицы, создаваемой посредством этой обертки, можно задать следующие параметры:

force_not_null
Это логический параметр. true указывает, что значения столбца не должны сверяться с нулевой строкой (то есть со значением, заданным параметром null на уровне таблицы). Эффект аналогичен включению столбца в список параметра FORCE_NOT_NULL команды COPY.

force_null
Это логический параметр. true указывает, что значения столбца, соответствующие нулевой строке, должны возвращаться как 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, то показывается также размер файла (в байтах).

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

Одно из очевидных применений file_fdw — это предоставления запросам доступа к журналу операций QHB как к таблице. Для этого необходимо заранее настроить вывод сообщений в файл CSV, который мы далее будем называть qhblog.csv. Сначала установите расширение file_fdw:

CREATE EXTENSION file_fdw;

Затем создайте сторонний сервер:

CREATE SERVER qhblog FOREIGN DATA WRAPPER file_fdw;

Теперь вы готовы к созданию сторонней таблицы. В команде CREATE FOREIGN TABLE нужно определить столбцы таблицы, имя файла CSV и его формат:

CREATE FOREIGN TABLE qhblog (
  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 qhblog
OPTIONS ( filename 'log/qhblog.csv', format 'csv' );

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