【发布时间】:2012-10-27 06:26:53
【问题描述】:
有没有什么方法可以在触发函数中访问文本文件中的数据?
【问题讨论】:
标签: postgresql text triggers
有没有什么方法可以在触发函数中访问文本文件中的数据?
【问题讨论】:
标签: postgresql text triggers
您可以为此使用标准的 plpgsql 函数。
如果我们谈论的是 CSV 文件(或类似文件)并且该文件位于您使用 COPY 的数据库服务器上。我引用手册here。
带有文件名的COPY指示PostgreSQL服务器直接读取 从或写入文件。服务器必须可以访问该文件,并且 必须从服务器的角度指定名称。
对于更复杂的操作,您可能希望使用临时表作为临时表,将COPY 文件放入其中并从那里使用纯 SQL 命令。 Similar to this example。确保您不会在尝试在同一会话中多次创建同一个表时遇到冲突...
还有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 目录到任何其他目录的符号链接来克服路径限制。不过要警惕可能的安全隐患。
最后,您可以使用foreign data wrapper 访问服务器文件系统中的数据文件。为此,您需要额外的模块 file_fdw。每个数据库安装一次:
CREATE EXTENSION file_fdw;
【讨论】:
是的,但您需要一种不受信任的语言 pl/sh、pl/perlu、C 等。
如果您解释为什么需要这样做,可能会有更好的方法。
【讨论】:
您可以将我的"PostgreSQL File I/O Functions" 扩展名用于基本文件 I/O。
免责声明:我是此扩展程序的作者,我提供此扩展程序是为了解决问题。
【讨论】: