# F.14.文件_fdw
这个文件_fdw
模块提供外部数据包装器文件_fdw
,可用于访问服务器文件系统中的数据文件,或在服务器上执行程序并读取其输出。数据文件或程序输出的格式必须能够被抄袭
; 看见复制详细信息。对数据文件的访问当前为只读。
使用此包装器创建的外部表可以有以下选项:
文件名
指定要读取的文件。相对路径是相对于数据目录的。任何一个文件名
或程序
必须指定,但不能同时指定两者。
程序
指定要执行的命令。此命令的标准输出将被读取为从程序中复制
都被使用了。任何一个程序
或文件名
必须指定,但不能同时指定两者。
总体安排
指定数据格式,与复制
是的总体安排
选项
标题
指定数据是否有标题行,与复制
是的标题
选项
定界符
指定数据分隔符字符,与复制
是的定界符
选项
引用
指定数据引号字符,与复制
是的引用
选项
逃跑
指定数据转义字符,与复制
是的逃跑
选项
无效的
指定数据空字符串,与复制
是的无效的
选项
编码
指定数据编码,与复制
是的编码
选项
请注意复制
允许以下选项:标题
要在没有相应值的情况下指定,foreign table选项语法要求在所有情况下都存在一个值。激活复制
通常不带值写入的选项,可以传递值TRUE,因为所有这些选项都是布尔值。
使用此包装器创建的外部表的列可以有以下选项:
强制不为空
这是一个布尔选项。如果为true,则指定列的值不应与空字符串(即表级别)匹配无效的
选项)。这与在中列出列具有相同的效果复制
是的强制不为空
选项
强制无效
这是一个布尔选项。如果为true,则指定与空字符串匹配的列的值作为无效的
即使引用了该值。如果没有此选项,则只有与空字符串匹配的未加引号的值返回为空无效的
。这与在中列出列具有相同的效果复制
是的强制无效
选项
复制
是的强制引用
选项当前不受支持文件_fdw
.
只能为外部表或其列指定这些选项,而不能在文件_fdw
外部数据包装器,也不在使用包装器的服务器或用户映射选项中。
更改表级选项需要成为超级用户或具有该角色的权限pg_读取_服务器_文件
(使用文件名)或角色pg_执行_服务器_程序
(使用程序),出于安全原因:只有某些用户才能控制读取哪个文件或运行哪个程序。原则上,普通用户可以更改其他选项,但目前不支持。
在指定程序
选项,请记住,选项字符串是由shell执行的。如果需要向命令传递任何来自不受信任源的参数,则必须小心删除或转义任何可能对shell有特殊意义的字符。出于安全原因,最好使用固定的命令字符串,或者至少避免在其中传递任何用户输入。
对于使用文件_fdw
, 解释
显示要读取的文件或要运行的程序的名称。一份文件,除非降低成本
指定时,也会显示文件大小(以字节为单位)。
例F.1.为PostgreSQL CSV日志创建外部表
它的一个明显用途是文件_fdw
是将PostgreSQL活动日志作为一个表进行查询。要做到这一点,首先你必须登录到CSV文件,在这里我们将称之为pglog。csv
.首先,安装文件_fdw
作为扩展:
CREATE EXTENSION file_fdw;
然后创建一个外部服务器:
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
现在,您可以创建外部数据表了。使用创建外部表
命令,则需要定义表的列、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' );
就是这样,现在你可以直接查询你的日志了。当然,在生产中,您需要定义一些处理原木旋转的方法。