有什么方法可以在触发器函数中访问文本文件中的数据?
3 回答
您可以为此使用标准的 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;
是的,但您需要一种不受信任的语言 pl/sh、pl/perlu、C 等。
如果您解释为什么需要这样做,可能会有更好的方法。
您可以将我的“PostgreSQL 文件 I/O 函数”扩展用于基本文件 I/O。
免责声明:我是这个扩展的作者,我提供它作为问题的解决方案。