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' );
Вот и все — теперь вы можете обращаться к вашему журналу напрямую. В производственной среде, конечно, вам потребуется определить способ работы с ротацией журнала.