2008-12-09 2 views
2

Может быть, мое название непонятно. Я ищу какой-то контроль над версиями в таблицах базы данных, например, subversion на файлах, например, wiki.Есть ли библиотека/фреймворк для изменения строк в базе данных?

Я хочу отслеживать журнал изменений. Я хочу извлечь и запустить diff в обратном порядке. (отмените как «svn merge -r 101: 100»). Мне может понадобиться индексированный поиск по истории.

Я прочитал «Design Pattern for Undo Engine», но это связано с «Шаблоны». Есть ли что-нибудь, что я мог бы повторно использовать, не изобретая велосипед?

EDIT: Например, банковский счет. У меня есть столбец «баланс» (и другие), обновленный в таблице. пользователь найдет ошибку у него через 10 дней, и он захочет отменить/отменить конкретную транзакцию, не меняя других.

Как я могу сделать это изящно на уровне приложения?

+0

Возможно, вам захочется посмотреть здесь: http://stackoverflow.com/questions/323065/how-to-version-control-a-record-in-a-database – 2008-12-10 10:21:37

+0

Я не спрашивал, как я могу это сделать , Я просил, есть ли какой-нибудь код, который мы можем использовать повторно. – 2009-11-29 14:33:36

ответ

2

Martin Fowler охватывает тему в Patterns for things that change with time. Все еще шаблоны, а не фактические рамки, но он показывает пример данных и как их использовать.

1

Педантичный пункт. Пример вашего банковского счета не пройдет мимо аудитора/регулятора.

Любые ошибочные записи в учетной записи должны быть оставлены для записи. Для учетной записи будет применена равная и противоположная транзакция коррекции. Фактически откат исходной транзакции, но оставляющий очень очевидный след исходной ошибки и ее коррекции.

+1

Вот чего я хочу. Я не собираюсь отменять эту фиксацию, но позволю мне отслеживать и отменять (например, «svn merge -r 101: 100» с другим «svn commit») Но как я могу изящно реализовать его в своем приложении? – 2008-12-09 15:09:29

2

Вы можете использовать подход ревизии для каждой записи, которую вы хотите отслеживать. Это будет включать сохранение строки в таблице для каждой ревизии записи. Записи будут связаны между собой общим «идентификатором» и могут быть запрошены в «Ревизионном статусе» (например, получить последнюю запись «Утвержденная»).

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

[ID] [Revision Date] [Revision Status] [Modified By] [Balance] 
1  1-1-2008   Expired   User1   $100 
1  1-2-2008   Expired   User2   $200 
2  1-2-2008   Approved   User3   $300 
1  1-3-2008   Approved   User1   $250 
+0

Столбец Revision Staus кажется мне лишним, это холодно, если бы было несколько строк с одним и тем же идентификатором, только один с максимальной/последней версией даты одобрен, а все остальные истекли? – jamiebarrow 2012-04-10 23:13:09

0

Основываясь на ваших комментариях к Джеймсу Андерсону, у меня был бы интерфейс пользователя, который написал бы новую вставку при отмене транзакции. Он вставляет новую запись в таблицу, которая имеет те же значения, что и отмененная транзакция, за исключением того, что значение будет отрицательным числом вместо положительного числа. Если у вас есть структура, которая включает в себя что-то для определения цели транзакции, я бы сказал, что она отменена, и номер записи транзакции, которую он отменял.

0

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

Там изрядное количество тонкости в такую ​​конструкцию базы данных, но есть очень хорошая книга по теме:

Разработки Time-ориентированных баз данных приложений в SQL Ричарда Т.Snodgrass

доступны для скачивания здесь:

http://www.cs.arizona.edu/people/rts/tdbbook.pdf

Использование транзакций базы данных будет плохая идея, потому что замки было бы создать в базе данных - в основном транзакции базы данных должны быть как можно короче.

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

0

Основываясь на различных комментариях, возможное решение проблемы может заключаться в том, чтобы сделать таблицу с эффективностью даты.

В основном вы добавляете достоверные и актуальные столбцы в каждую таблицу.

«Текущая» запись всегда должна иметь действительный_то_данал «2999-12-31» или какое-либо высокое значение арбитража. При изменении значения вы меняете «действительную дату» на текущую дату и вставляете новую строку с действительной датой сегодняшнего дня и действительной датой копии «2999-12-31» все столбцы из старой строки, если они не были изменены.

Вы можете создавать представления с «выбрать все-столбцы, за исключением недействительной-ой-дата из таблицы, где действует актуальный =„2999-12-31“»

который позволит всем текущему запросы работать без изменений.

Это очень распространенное явление в средах хранилища данных и для таких вещей, как обменные курсы, где важна эффективная дата.

Логика отмены должна быть очевидной.

0

Я не знаю определенного шаблона, хотя перед использованием триггеров и спредов я создал полные истории отмены/аудита.

Есть несколько приложений для MS Sql, которые позволяют вам тратиться через журналы и видеть фактические изменения.

Я использовал один вызванный Log Navigator назад с MS SQL 2000, который использовал, чтобы позволить мне отменить конкретную историческую транзакцию. Однако я не могу ее найти.

http://www.lumigent.com и http://www.apexsql.com делать инструменты для просмотра журналов, но я не думаю, что они позволят вам откинуть их назад.

Я думаю, что лучший способ сделать это - написать свое приложение с учетом этого - у вас есть несколько хороших предложений здесь о том, как это сделать.

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