F.17. file_fdw — доступ к файлам данных в файловой системе сервера#

F.17. file_fdw — доступ к файлам данных в файловой системе сервера

F.17. 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 (то есть опцией null на уровне таблицы). Результат такой же, как при указании столбца в опции FORCE_NOT_NULL команды COPY.

force_null

Это логическая опция. Если установлено значение true, то указывается, что значения столбца, соответствующие пустой строке, возвращаются как NULL, даже если значение заключено в кавычки. Без этой опции возвращаются только значения без кавычек, соответствующие пустой строке, как NULL. Это имеет тот же эффект, что и указание столбца в опции FORCE_NULL команды COPY.

Опция FORCE_QUOTE команды COPY в настоящее время не поддерживается file_fdw.

Эти параметры можно указать только для внешней таблицы или ее столбцов, а не в параметрах обертки внешних данных file_fdw, а также не в параметрах сервера или отображения пользователя, использующих эту обертку.

Изменение опций на уровне таблицы требует наличия прав суперпользователя или привилегий роли pg_read_server_files (для использования имени файла) или роли pg_execute_server_program (для использования программы) по соображениям безопасности: только определенные пользователи должны иметь возможность контролировать, какой файл читается или какая программа запускается. В принципе, обычным пользователям можно разрешить изменять другие опции, но в настоящее время это не поддерживается.

При указании опции program имейте в виду, что строка опции выполняется оболочкой. Если вам нужно передать какие-либо аргументы команде, которые поступают из ненадежного источника, необходимо быть осторожным и удалить или экранировать любые символы, которые могут иметь специальное значение для оболочки. По соображениям безопасности лучше использовать фиксированную строку команды или, по крайней мере, избегать передачи в ней пользовательского ввода.

Для внешней таблицы, использующей file_fdw, EXPLAIN показывает имя файла, который будет прочитан, или программы, которая будет запущена. Для файла, если не указано COSTS OFF, также показывается размер файла (в байтах).

Пример F.1. Создание внешней таблицы для CSV-логов 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' );

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