2012-02-12 2 views
3

Просто начните с триггеров PostgreSQL, и мне интересно, возможно ли следующее: У меня есть таблица, в которой столбец хранит пути файловой системы к файлам изображений. Например, поле «img_path» каждой записи может содержать что-то вроде «c: \ images \ a_great_image.jpg» или что-то в этом роде.Триггер PostgreSQL, который перемещает файл в файловой системе

Когда пользователь базы данных меняет значение в этом поле, возможно ли, что функция триггера postgresql может позаботиться (хотя бы попытаться) «переместить» этот файл в его новое заданное местоположение?

Большое спасибо за совет.

+1

Да, вы можете это сделать, но имейте в виду, что транзакции возможны только при работе с данными в базе данных. То есть файл находится в файловой системе, поэтому, если он по какой-то причине не может откатить его. Просто нужно иметь в виду. – Kuberchaun

ответ

2

Да. Возможно. Например, используйте plpython. Используйте это в триггере.

CREATE OR REPLACE FUNCTION move_file(old_path text, new_path text) 
RETURNS boolean AS 
$$ 
    import shutil 
    try: 
     shutil.move(old_path, new_path) 
     return True 
    except: 
     return False 
$$ 
    LANGUAGE 'plpythonu' VOLATILE; 
+0

Благодарим вас за этот отличный пример. Как отметил JustBob выше, транзакция все равно будет выполнена, даже если функция вернет false, правильно? Есть ли способ откат на основе результата функции триггера? Спасибо! – Joebocop

+1

Вы можете создавать исключения, когда move_file возвращает false. – iddqd

Смежные вопросы