# 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' );

就是这样,现在你可以直接查询你的日志了。当然,在生产中,您需要定义一些处理原木旋转的方法。