F.16. file_fdw — 访问服务器文件系统中的数据文件#
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这是一个布尔选项。如果为 true,则指定不应将列的值与空字符串匹配(即,表级别
null选项)。这与在COPY的FORCE_NOT_NULL选项中列出列的效果相同。force_null这是一个布尔选项。如果为 true,则指定即使该值带引号,与空字符串匹配的列的值也将作为
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,
backend_type text,
leader_pid integer,
query_id bigint
) SERVER pglog
OPTIONS ( filename 'log/pglog.csv', format 'csv' );这就是全部内容——现在,您可以直接查询日志。当然,在生产中,您需要定义某种方法来处理日志轮换。
