Чтение данных из текстового файла внутри триггера

Есть ли способ, с помощью которого данные в текстовом файле могут быть доступны внутри функции триггера?

3 ответа

Решение

Для этого вы можете использовать стандартные функции plpgsql.

COPY

Если речь идет о 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 в любой другой каталог. Однако будьте осторожны с возможными последствиями для безопасности.

file_fdw

Наконец, вы можете использовать стороннюю оболочку данных для доступа к файлам данных в файловой системе сервера. Вам нужен дополнительный модуль file_fdw за это. Установите один раз для каждой базы данных с:

CREATE EXTENSION file_fdw;

Да, но вам понадобится один из ненадежных языков pl/sh, pl/perlu, C и т. Д.

Если вы объясните, почему вам нужно это сделать, возможно, есть лучший способ.

Вы можете использовать мое расширение "Функции ввода-вывода файлов PostgreSQL" для базового ввода-вывода файлов.

Отказ от ответственности: я являюсь автором этого расширения, которое я предлагаю в качестве решения проблемы.

Другие вопросы по тегам