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
指定数据的空字符串,和COPY
的NULL
选项相同。
encoding
指定数据的编码,和COPY
的ENCODING
选项相同。
注意虽然COPY
允许诸如HEADER
的选项不用一个相应的值指定,
但是外部表选项语法要求在所有情况下都出现一个值。要激活通常写入没有值的
COPY
选项,你可以传递值 TRUE,因为所有这些选项都是布尔值。
使用这个包装器创建的表的一列可以具有下列选项:
force_not_null
这是一个布尔选项。如果为真,它指定该列的值不应该与空字符串匹配(也就是表级别的null
选项)。这和把该列放在COPY
的FORCE_NOT_NULL
选项中具有相同的效果。
force_null
这是一个布尔选项。如果为真,它指定匹配空值字符串的列值会被返回为NULL
,
即使该值被引号引用。如果没有这个选项,只有匹配空值字符串的未被引用的值会被返回为
NULL
。这和在COPY
的FORCE_NULL
选项中列出该列有同样的效果。
COPY
的FORCE_QUOTE
选项当前不被file_fdw
支持。
这些选项只能为一个外部表及其列指定,而不能在file_fdw
外部数据包装器的选项中指定,也不能在使用该包装器的服务器或者用户映射的选项中指定。
出于安全原因,改变表级别的选项要求超级用户特权或
具有默认角色pg_read_server_files
(使用文件名)或
默认角色pg_execute_server_program
(使用程序)的权限:
只有特定用户能够控制读取哪个文件或者运行哪个程序。
原则上普通用户可以被允许改变其它选项,但是当前还不支持这样做。
当指定program
选项时,请记住,选项字符串是通过shell执行的。
如果想传递任何参数到来自不受信任的源的命令,
必须小心去掉或转义任何对shell来说可能有特殊含义的字符。安全起见,最好使用固定的命令字符串,
或者至少避免传递任何用户输入。
对于一个使用file_fdw
的外部表,EXPLAIN
显示要读取的文件名或要运行的程序。对于文件来说,除非指定COSTS OFF
,否则文件尺寸(以字节计)也会被显示。
例 F.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 ) SERVER pglog OPTIONS ( filename '/home/josh/data/log/pglog.csv', format 'csv' );
就是这样了 — 现在你能够直接查询你的日志了。当然,在生产中你会需要定义一些方法来处理日志轮转。