簡體   English   中英

從觸發器內的文本文件中讀取數據

[英]Read data from a text file inside a trigger

是否可以通過某種方式在觸發器函數中訪問文本文件上的數據?

您可以為此使用標准的plpgsql函數。

復制

如果我們正在談論CSV文件(或類似文件)並且該文件位於db服務器上,則可以使用COPY 我在這里引用手冊。

帶有文件名的COPY指示PostgreSQL服務器直接從文件讀取或寫入文件。 服務器必須可以訪問該文件,並且必須從服務器的角度指定名稱。

對於更復雜的操作,您可能希望使用臨時表作為登台表,將文件COPY到其中並從那里使用普通的SQL命令。 與此示例類似 確保您不會在嘗試在同一會話中多次創建同一表時遇到沖突,但是...

pg_read_file()

還有通用的文件訪問功能 出於安全原因,它們的使用受到限制:

只能訪問數據庫集群目錄和log_directory中的文件。 為群集目錄中的文件使用相對路徑,為日志文件使用與log_directory配置設置匹配的路徑。 這些功能僅限於超級用戶使用。

我用它來讀取小的XML文件並在PostgreSQL中進行處理。 演示:

CREATE OR REPLACE FUNCTION f_import_from_file()
  RETURNS boolean AS
$BODY$
DECLARE
   myxml    xml;
   datafile text := 'path/relative/to/db_cluster/myfile.xml';
BEGIN

myxml := pg_read_file(datafile, 0, 10000000);   -- 10 MB max.

-- do stuff, like INSERT ...

$BODY$

您可以使用從db目錄到任何其他目錄的符號鏈接來克服路徑限制。 但是要警惕可能的安全隱患。

file_fdw

最后,您可以使用外部數據包裝器訪問服務器文件系統中的數據文件。 file_fdw ,您需要其他模塊file_fdw 每個數據庫安裝一次:

CREATE EXTENSION file_fdw;

是的,但是您需要一種不受信任的語言pl / sh,pl / perlu,C等。

如果您解釋為什么需要這樣做,可能會有更好的方法。

您可以將我的“ PostgreSQL文件I / O功能”擴展名用於基本文件I / O。

免責聲明:我是此擴展程序的作者,我將其作為對此問題的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM