Russian Qt Forum
Ноябрь 23, 2024, 18:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Undo/Redo базы данных  (Прочитано 3479 раз)
Akon
Гость
« : Декабрь 08, 2012, 11:45 »

Друзья, задача примерно такая: есть БД (на PostgreSQL), доступ пользователей на запись сериализован (ну, как мьютекс). Далее необходимо вести журнал изменений записей (изменение - это не транзакция, а атомарное изменение типа добавить/удалить запись или изменить значение столбца), доступный всем пользователям. Журнал единый, но с каждым изменением сопоставлен сделавший это изменение пользователь. Получивший доступ на запись пользователь имеет возможность выполнять Undo/Redo операции, в т.ч. изменения, сделанные другими пользователями. Структура таблиц постоянна, новые таблицы не создаются. Для связи приложения с БД используется ORM (OBD), т.е. функции СУБД редуцированы до простого хранилища, там нет бизнес-логики. В рамках данной задачи, по-возможности, хотелось бы придерживаться этого направления.

Тем не менее, имеются ли PostgreSQL встроенные средства для решения этой задачи, или нужно делать все самому (создавать дополнительные таблицы под журнал, следить за его соглавованностью и т.п.)?

Если у кого есть опыт решения подобной задачи, пожалуйста, поделитесь. Особенно, если было с ORM.

« Последнее редактирование: Декабрь 08, 2012, 12:02 от Akon » Записан
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #1 : Декабрь 27, 2012, 17:46 »

Сорри что времени много прошло - но лучше же поздно, чем никогда?

В общем случае такое для СУБД делается только руками, потому что нужно идти на множество компромиссов и допущений.

Пример:
Пользователь 1 создал запись ну пусть карточки клиента, а второй - выписал документ на этого клиента.
И как тут можно отменить действие первого?


В SQL примерно так работает механизм транзакций (он у тебя в БД априори), но:
1. Транзакция может подтверждаться только тем клиентом, который ее открыл. И только в той же сессии.
2. На объекты в неподтвержденной транзакции не может быть ссылок из других транзакций.
3. ORM работает на более высоком уровне. Его придется обходить.

Соотвествнно, в твоём случае, я бы делал так:
1. На каждую таблицу создавал бы таблицу логов (скриптами, ессно), все действия с осн. таблицей логгировать тригерами (которые тоже создаются скриптом, чтобы в случае изменения полей / и т.п. просто и быстро пересоздать все)
В логе для update / delete хранил бы старые элементы записей. Для insert-а вобщем не важно Улыбающийся.
2. Пользователю с правами давал бы на просмотр эти таблицы с выбором, до какого элемента откатывать.
3. Ну и раздел с удалениями не забыть Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 23.