从触发器内的文本文件读取数据

问题描述 投票:0回答:3

有什么方法可以在触发器函数内访问文本文件上的数据吗?

postgresql text triggers
3个回答
4
投票

您可以使用标准 PL/pgSQL 函数。

COPY

对于数据库服务器上的 CSV 文件(或类似文件),请使用

COPY
手册

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

对于更复杂的操作,您可能需要使用临时表作为临时表,将文件放入其中并从那里使用纯 SQL 命令。

类似于这个例子
。不过,请确保尝试在同一会话中多次创建同一个表时不会遇到冲突...... 如果该文件是您的客户端的本地文件和/或您的权限受到限制,请考虑使用 psql 中的

COPY

。参见:


    从 PostgreSQL 表中导出特定行作为 INSERT SQL 脚本
\copy

还有

通用文件访问功能

。出于安全原因,它们的使用受到相当限制:

仅数据库集群目录和log_directory中的文件 可以访问。对集群中的文件使用相对路径 目录,以及与 log_directory 配置设置匹配的路径 对于日志文件。这些功能的使用仅限于超级用户。

我用它来读取小型 XML 文件并在 PostgreSQL 中进行处理。演示:

pg_read_file()

您可以使用从 db 目录到任何其他目录的符号链接来克服路径限制。警惕可能的安全隐患。

CREATE OR REPLACE FUNCTION f_import_from_file() RETURNS boolean LANGUAGE plpgsql AS $func$ 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 ... $func$

您还可以使用“外部数据包装器”来访问服务器文件系统中的数据文件。为此,您需要额外的模块 

file_fdw。每个数据库安装一次:

file_fdw

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

1
投票

您可以使用我的

“PostgreSQL 文件 I/O 函数”

0
投票

免责声明:我是此扩展的作者,我提供该扩展作为问题的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.