2

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

4

3 回答 3

4

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

复制

如果我们谈论的是 CSV 文件(或类似文件)并且该文件位于您使用的数据库服务器上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 目录到任何其他目录的符号链接来克服路径限制。不过要警惕可能的安全隐患。

文件_fdw

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

CREATE EXTENSION file_fdw;
于 2012-10-27T07:34:47.080 回答
1

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

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

于 2012-10-27T07:16:14.617 回答
0

您可以将我的“PostgreSQL 文件 I/O 函数”扩展用于基本文件 I/O。

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

于 2015-02-28T15:10:02.483 回答