【问题标题】:Read data from a text file inside a trigger从触发器内的文本文件中读取数据
【发布时间】:2012-10-27 06:26:53
【问题描述】:

有没有什么方法可以在触发函数中访问文本文件中的数据?

【问题讨论】:

    标签: postgresql text triggers


    【解决方案1】:

    您可以为此使用标准的 plpgsql 函数。

    复制

    如果我们谈论的是 CSV 文件(或类似文件)并且该文件位于您使用 COPY 的数据库服务器上。我引用手册here

    带有文件名的COPY指示PostgreSQL服务器直接读取 从或写入文件。服务器必须可以访问该文件,并且 必须从服务器的角度指定名称。

    对于更复杂的操作,您可能希望使用临时表作为临时表,将COPY 文件放入其中并从那里使用纯 SQL 命令。 Similar to this example。确保您不会在尝试在同一会话中多次创建同一个表时遇到冲突...

    pg_read_file()

    还有generic file access functions。出于安全原因,它们的使用受到相当限制:

    仅数据库集群目录和 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

    最后,您可以使用foreign data wrapper 访问服务器文件系统中的数据文件。为此,您需要额外的模块 file_fdw。每个数据库安装一次:

    CREATE EXTENSION file_fdw;
    

    【讨论】:

    • 非常感谢您的详细回答。 pg_read_file() 为我做了诀窍。真的很有帮助。
    【解决方案2】:

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

    如果您解释为什么需要这样做,可能会有更好的方法。

    【讨论】:

      【解决方案3】:

      您可以将我的"PostgreSQL File I/O Functions" 扩展名用于基本文件 I/O。

      免责声明:我是此扩展程序的作者,我提供此扩展程序是为了解决问题。

      【讨论】:

      • 您应该在答案中添加扩展名,并声明您是它的作者。考虑让答案不仅仅是一个链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2011-02-08
      • 2013-10-01
      • 2012-06-10
      相关资源
      最近更新 更多