有没有办法在触发器功能中访问文本文件中的数据?
答案 0 :(得分:4)
您可以使用标准的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;
答案 1 :(得分:1)
是的,但你需要一种不受信任的语言pl / sh,pl / perlu,C等。
如果您解释为什么需要这样做,可能会有更好的方法。
答案 2 :(得分:0)
您可以将我的"PostgreSQL File I/O Functions"扩展名用于基本文件I / O.
免责声明:我是此扩展程序的作者,我提供此解决方案来解决此问题。