Чтение данных из текстового файла внутри триггера
Есть ли способ, с помощью которого данные в текстовом файле могут быть доступны внутри функции триггера?
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" для базового ввода-вывода файлов.
Отказ от ответственности: я являюсь автором этого расширения, которое я предлагаю в качестве решения проблемы.