Можно ли изменить возвращаемое значение DELETE в PostgreSQL? - PullRequest
2 голосов
/ 18 мая 2010

Я пытаюсь запретить пользователям возможность безвозвратно удалять пробелы в вики Confluence. Моей первой быстрой мыслью было переименовать таблицу spaces в allspaces, добавить новый столбец deleted и создать представление spaces вместо старой таблицы. Представление вернет только не удаленные пробелы. Я создал три правила, чтобы разрешить INSERT, UPDATE и DELETE в представлении spaces. Правило DELETE просто меняет поле deleted и таким образом удаляет его из представления, но все данные остаются в базе данных.

Теперь проблема в том, что операторы DELETE для spaces возвращают DELETE 0 из PostgreSQL. Это приводит к тому, что Hibernate выкидывает и выбрасывает исключение, а Confluence взрывается.

В любом случае можно ли изменить строки возврата PostgreSQL вместо строк, удаленных в правиле INSTEAD.

Ответы [ 3 ]

1 голос
/ 30 апреля 2011

Не уверен, насколько хорошо это будет масштабироваться (в зависимости от количества пространств, которыми вы должны управлять), но я бы периодически делал резервную копию пространства в XML. Это можно легко сделать через API, используя Confluence CLI :

confluence --action exportSpace --space "spaceName" --file "target/output/confluencecli/spaceName.xml"

Вы можете вращать эти резервные копии в зависимости от возраста и сохранять только самые последние из них в случае удаления пользователем пространства.

Чтобы продвинуться дальше, вы можете изменить действие (confluence/spaces/removespace.vm), которое фактически удаляет пространство, и вставить логику для резервного копирования пространства в XML до подтверждения удаления. Это было бы намного лучше!

1 голос
/ 02 мая 2011

Вы можете добавить триггер ON DELETE, который сохраняет удаленную строку в таблицу архива. Вы можете добавить функцию восстановления в ваше приложение для восстановления удаленных строк.

0 голосов
/ 28 июня 2010

Я не совсем понимаю, чего вы хотите достичь, но, возможно, вы могли бы поместить оператор delete в функцию, которая возвращает VOID, а затем вызвать ее.

CREATE OR REPLACE FUNCTION delete_space(pid integer)
  RETURNS void AS
$BODY$ 
DECLARE aid INTEGER;
BEGIN
    delete from spaces where id=pid;
    return;
END;
$BODY$
  LANGUAGE 'plpgsql';

Для использования:

select * from delete_space(3);  
...