Модуль file_fdw предоставляет обертку сторонних данных
file_fdw, которую можно использовать для доступа к файлам данных в файловой системе сервера или для выполнения программ на сервере и чтения их вывода. Файл данных или вывод программы должен быть в формате,
который может быть прочитан командой COPY FROM;
подробности см. в разделе COPY .
В настоящее время доступ к файлам данных возможен только в режиме чтения.
Внешняя таблица, созданная с использованием этой обертки, может иметь следующие параметры:
filename
Определяет путь к считываемому файлу. Относительные пути указываются относительно каталога данных. Должен быть задан параметр filename или program ,
но не оба одновременно.
program
Задает команду для выполнения. Стандартный вывод этой команды будет считываться так же, как COPY FROM PROGRAM использовались.
Либо program или filename ,
но не оба одновременно.
format
Определяет формат данных, аналогично параметру COPYкоманды FORMAT параметру.
header
Определяет, содержат ли данные строку заголовка, аналогично параметру COPYкоманды HEADER параметру.
delimiter
Определяет символ-разделитель данных, аналогично параметру COPYкоманды DELIMITER параметру.
quote
Определяет символ кавычки для данных, аналогично параметру COPYкоманды QUOTE параметру.
escape
Определяет символ экранирования данных,
аналогично параметру COPYкоманды ESCAPE параметру.
null
Определяет строку, представляющую значение null,
аналогично параметру NULL команды COPY.
encoding
Определяет кодировку данных,
аналогично параметру COPYкоманды ENCODING параметру.
Обратите внимание, что хотя COPY позволяет указывать такие параметры, как HEADER
без соответствующего значения, синтаксис параметров внешней таблицы требует обязательного наличия значения во всех случаях. Чтобы активировать
COPY параметры, обычно записываемые без значения, можно передать значение TRUE, так как все такие параметры являются логическими.
Столбец внешней таблицы, созданной с помощью данной обертки, может иметь следующие параметры:
force_not_null
Это логический параметр. Если значение равно true, оно определяет, что значения столбца не должны сопоставляться со строкой null (то есть с параметром null уровня таблицы). Это имеет тот же эффект,
что и перечисление столбца в COPYв
FORCE_NOT_NULL параметру.
force_null
Это логический параметр. Если значение равно true, оно определяет, что значения столбца, соответствующие строке null, возвращаются как NULL
даже если значение заключено в кавычки. Без этого параметра только значения без кавычек, соответствующие NULL-строке, возвращаются как NULL.
Это дает тот же эффект, что и перечисление столбца в
COPYкоманды FORCE_NULL параметру.
COPYкоманды FORCE_QUOTE параметр в настоящее время
не поддерживается file_fdw.
Данные параметры могут быть заданы только для внешней таблицы или ее столбцов, но не в параметрах file_fdw обертки сторонних данных, и не в параметрах сервера или сопоставления пользователей, использующих данную обертку.
Изменение параметров на уровне таблицы требует прав суперпользователя или наличия прав роли pg_read_server_files (для использования имени файла) или
роли pg_execute_server_program (для использования программы) по соображениям безопасности: только определенным пользователям должен быть разрешен контроль над тем, какой файл считывается или какая программа запускается. В принципе, обычным пользователям можно было бы разрешить изменять другие параметры, но на данный момент это не поддерживается.
При указании параметра program имейте в виду, что строка параметра исполняется командной оболочкой. Если вам необходимо передать команде аргументы, полученные из ненадежного источника, необходимо тщательно удалять или экранировать любые символы, которые могут иметь специальное значение для командной оболочки. По соображениям безопасности лучше использовать фиксированную строку команды или, по крайней мере, избегать передачи в ней любого пользовательского ввода.
Для внешней таблицы, использующей file_fdw, EXPLAIN отображает
имя считываемого файла или запускаемой программы.
Для файла, если только не COSTS OFF указан, также отображается размер файла (в байтах).
Пример 8.6.1. Создание внешней таблицы для журналов PostgreSQL в формате CSV
Одним из очевидных способов использования 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' );
На этом всё — теперь вы можете выполнять запросы к журналу напрямую. В промышленной среде, разумеется, потребуется определить способ обработки ротации журналов.
Пример 8.6.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' );