F.16. 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в даннÑÑ (аналогиÑно ÑказаниÑNULLв командеCOPY).encodingÐадаÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ð´Ð°Ð½Ð½ÑÑ (аналогиÑно ÑказаниÑ
ENCODINGв командеCOPY).
ÐамеÑÑÑе, ÑÑо Ñ
оÑÑ COPY пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑказаниÑ, Ñакие как 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 не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñказание FORCE_QUOTE ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COPY.
ÐеÑеÑиÑленнÑе паÑамеÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ ÑолÑко Ð´Ð»Ñ ÑÑоÑонниÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸Ð»Ð¸ иÑ
ÑÑолбÑов. ÐÑ
нелÑÐ·Ñ ÑказаÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑÑки ÑÑоÑонниÑ
даннÑÑ
file_fdw, ÑеÑвеÑов или ÑопоÑÑавлений полÑзоваÑелей, иÑполÑзÑÑÑиÑ
ÑÑÑ Ð¾Ð±ÑÑÑкÑ.
ÐÐ»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов, опÑеделÑемÑÑ
Ð´Ð»Ñ ÑаблиÑÑ, ÑÑебÑеÑÑÑ Ð±ÑÑÑ ÑÑпеÑполÑзоваÑелем или имеÑÑ Ð¿Ñава Ñоли pg_read_server_files (Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñайла) или Ñоли pg_execute_server_program (Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿ÑогÑаммÑ). ÐÑо Ñделано в ÑелÑÑ
безопаÑноÑÑи: ÑолÑко избÑаннÑе полÑзоваÑели Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑбиÑаÑÑ, какой Ñайл ÑиÑаÑÑ Ð¸Ð»Ð¸ какÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð·Ð°Ð¿ÑÑкаÑÑ. РпÑинÑипе пÑаво Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑÑалÑнÑÑ
паÑамеÑÑов можно пÑедоÑÑавиÑÑ Ð¸ обÑÑнÑм полÑзоваÑелÑм, но в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑо не Ñеализовано.
ÐÐ°Ð´Ð°Ð²Ð°Ñ Ð¿Ð°ÑамеÑÑ program, помниÑе, ÑÑо ÑÑа ÑÑÑока вÑполнÑеÑÑÑ Ð¾Ð±Ð¾Ð»Ð¾Ñкой ÐС. ÐÑли Ð²Ñ Ñ
оÑиÑе пеÑедаваÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ команде паÑамеÑÑÑ Ð¸Ð· недовеÑенного иÑÑоÑника, позабоÑÑÑеÑÑ Ð¾Ð± иÑклÑÑении или ÑкÑаниÑовании вÑеÑ
Ñимволов, коÑоÑÑе могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ñобое назнаÑение в оболоÑке. Ðо ÑообÑажениÑм безопаÑноÑÑи лÑÑÑе, ÑÑÐ¾Ð±Ñ ÑÑа ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ ÑÑÑока бÑла ÑикÑиÑованной или как минимÑм в ней не пеÑедавалиÑÑ Ð´Ð°Ð½Ð½Ñе, поÑÑÑпаÑÑие Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ÐÐ»Ñ ÑÑоÑонниÑ
ÑаблиÑ, ÑабоÑаÑÑиÑ
ÑеÑез file_fdw, команда EXPLAIN показÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ Ð¸ÑполÑзÑемого Ñайла или запÑÑкаемой пÑогÑаммÑ. ÐÑли не ÑказÑваÑÑ COSTS OFF, Ñо вÑводиÑÑÑ Ð¸ ÑÐ°Ð·Ð¼ÐµÑ Ñайла (в байÑаÑ
).
ÐÑÐ¸Ð¼ÐµÑ F.1. Создание ÑÑоÑонней ÑаблиÑÑ Ð´Ð»Ñ Ð¶ÑÑнала ÑеÑвеÑа 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' );
ÐÐ¾Ñ Ð¸ вÑÑ. ТепеÑÑ Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа жÑÑнала ÑеÑвеÑа можно пÑоÑÑо вÑполнÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ðº ÑаблиÑе. РпÑоизводÑÑвенной ÑÑеде, ÑазÑмееÑÑÑ, еÑÑ Ð¿Ð¾ÑÑебÑеÑÑÑ ÐºÐ°Ðº-Ñо ÑÑеÑÑÑ ÑоÑаÑÐ¸Ñ Ñайлов жÑÑнала.