支援的版本:目前版本 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

F.15. file_fdw — 存取伺服器檔案系統中的資料檔案 #

file_fdw 模組提供了外部資料包裝器 file_fdw,可用於存取伺服器檔案系統中的資料檔案,或在伺服器上執行程式並讀取其輸出。資料檔案或程式輸出必須採用可由 COPY FROM 讀取的格式;詳情請參閱 COPY。目前對資料檔案的存取是唯讀的。

使用此包裝器建立的外部資料表可以具有以下選項:

filename

指定要讀取的檔案。相對路徑相對於資料目錄。必須指定 filenameprogram,但不能同時指定兩者。

program

指定要執行的命令。此命令的標準輸出將被讀取,就像使用了 COPY FROM PROGRAM 一樣。必須指定 programfilename,但不能同時指定兩者。

format

指定資料格式,與 COPYFORMAT 選項相同。

header

指定資料是否具有標頭行,與 COPYHEADER 選項相同。

delimiter

指定資料分隔符號,與 COPYDELIMITER 選項相同。

quote

指定資料引號字元,與 COPYQUOTE 選項相同。

escape

指定資料跳脫字元,與 COPYESCAPE 選項相同。

null

指定資料空字串,與 COPYNULL 選項相同。

encoding

指定資料編碼,與 COPYENCODING 選項相同。

請注意,雖然 COPY 允許指定諸如 HEADER 之類的選項,而無需相應的值,但外部資料表選項語法要求在所有情況下都必須存在值。若要啟用通常在沒有值的情況下編寫的 COPY 選項,您可以傳遞值 TRUE,因為所有這些選項都是布林值。

使用此包裝器建立的外部資料表的欄位可以具有以下選項:

force_not_null

這是一個布林選項。如果為 true,則指定不應將欄位的值與空字串(即資料表層級的 null 選項)進行比對。這具有與在 COPYFORCE_NOT_NULL 選項中列出欄位相同的效果。

force_null

這是一個布林選項。如果為 true,則指定即使值被引號括住,也應將與空字串比對的欄位值做為 NULL 傳回。如果沒有此選項,則只會將與空字串比對的未加上引號的值做為 NULL 傳回。這具有與在 COPYFORCE_NULL 選項中列出欄位相同的效果。

file_fdw 目前不支援 COPYFORCE_QUOTE 選項。

這些選項只能為外部資料表或其欄位指定,不能在 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' );

就是這樣 — 現在您可以直接查詢您的紀錄檔。當然,在生產環境中,您需要定義一些方法來處理紀錄檔輪換。


範例 F.2. 在欄位上建立帶有選項的外部資料表

若要為欄位設定 force_null 選項,請使用 OPTIONS 關鍵字。

CREATE FOREIGN TABLE films (
 code char(5) NOT NULL,
 title text NOT NULL,
 rating text OPTIONS (force_null 'true')
) SERVER film_server
OPTIONS ( filename 'films/db.csv', format 'csv' );

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。