
# file_fdw
file_fdw模块提供了外部数据封装器file_fdw， 可以用来在服务器的文件系统中访问数据文件。数据文件必须是COPY FROM可读的格式，具体请参见《参考》中"SQL参考 \> SQL语法 \> C \> COPY"章节。使用file_fdw访问的数据文件是当前可读的，不支持对该数据文件的写入操作。
当前GaussDB会默认编译file_fdw，initdb的时候会在pg_catalog schema中创建该插件。
file_fdw对应的server和外表只允许数据库的初始用户、系统管理员或开启运维模式时的运维管理员创建。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 为防止对服务端文件任意读，系统管理员及运维模式下运维管理员使用时会受enable_copy_server_files及safe_data_path两个参数的控制。
- 当参数enable_copy_server_files关闭时，只允许初始用户创建file_fdw类型外表，打开时系统管理员及运维模式下运维管理员可以创建file_fdw类型外表，以防止用户越权查看或修改敏感文件。
- 当参数enable_copy_server_files打开时，管理员可以通过GUC参数safe_data_path设置用户导入导出的路径校验，文件必须为safe_data_path路径的子路径，未设置此GUC参数的时候（默认情况），不对用户使用的路径进行拦截。
 
使用file_fdw创建的外部表可以有下列选项：
- filename 指定要读取的文件，必需的参数，且必须是一个绝对路径名。
  
- format 远端server的文件格式，支持text、csv、binary三种格式，非必需参数，和COPY语句的FORMAT选项相同。
  
- header 指定的文件是否有标题行，非必需参数，与COPY语句的HEADER选项相同。
  
- delimiter 指定文件的分隔符，非必需参数，与COPY的DELIMITER选项相同。
  
- quote 指定文件的引用字符，非必需参数，与COPY的QUOTE选项相同。
  
- escape 指定文件的转义字符，非必需参数，与COPY的ESCAPE选项相同。
  
- null 指定文件的null字符串，非必需参数，与COPY的NULL选项相同。
  
- encoding 指定文件的编码，非必需参数，与COPY的ENCODING选项相同。
  
- force_not_null 这是一个布尔选项，非必需参数。如果为真，则声明字段的值不应该匹配空字符串（也就是，文件级别null选项）。与COPY的FORCE_NOT_NULL选项里的字段相同。
  
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- file_fdw不支持COPY的OIDS和 FORCE_QUOTE选项。
- 这些选项只能为外部表或外部表的字段声明，不是file_fdw的选项，也不是使用file_fdw的服务器或用户映射的选项。
- 修改表级别的选项需要系统管理员权限。因为安全原因，只有系统管理员能够决定读取的文件。
- 对于一个使用file_fdw的外部表，EXPLAIN可显示要读取的文件名和文件大小（单位：字节）。指定了COSTS OFF关键字之后，不显示文件大小。
 
#### 使用file_fdw
- 创建服务器对象：CREATE SERVER。
- 创建用户映射：CREATE USER MAPPING。
- 创建外表：CREATE FOREIGN TABLE。
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 外表的表结构需要与指定的文件的数据保持一致。
  
  - 对外表做查询操作时不允许写操作。
    
- 删除外表：DROP FOREIGN TABLE。
- 删除用户映射：DROP USER MAPPING。
- 删除服务器对象：DROP SERVER。
 
#### 注意事项
- 使用file_fdw需要指定要读取的文件，请先准备好该文件，并授予数据库对该文件的读取权限。
- 不支持DROP EXTENSION file_fdw操作。
 
