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

时间:2012-10-27 06:26:53

标签: postgresql text triggers

有没有办法在触发器功能中访问文本文件中的数据?

3 个答案:

答案 0 :(得分:4)

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

COPY

如果我们正在讨论CSV文件(或类似文件)并且文件位于数据库服务器上,则使用COPY。我引用手册here

  

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

对于更复杂的操作,您可能希望将临时表用作临时表,将COPY文件放入其中并使用纯SQL命令。 Similar to this example。请确保您不会遇到与尝试在同一会话中多次创建同一个表的冲突,但是......

pg_read_file()

还有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目录到任何其他目录来克服路径限制。但是要注意可能的安全隐患。

file_fdw

最后,您可以使用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.

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