Existe alguma biblioteca / quadro para desfazer / refazer alterações de linhas no banco de dados?

votos
2

Pode ser meu título não é clara. Eu estou procurando algum tipo de controle de versão em tabelas de banco de dados, como subversão faz em arquivos, como wiki faz.

Quero traçar log as alterações. Eu quero extrair e executar o diff em sentido inverso. (Desfazer como um svn merge -r 101: 100). Posso precisar de uma busca indexada sobre a história.

Eu li o Design Pattern para Undo Motor , mas ela está relacionada com padrões. Há qualquer coisa que eu poderia reutilizar sem reinventar a roda?

EDIT: Por exemplo, transações de contas bancárias. Tenho coluna equilíbrio (e outros) são atualizadas na tabela. um usuário vai encontrar um erro por ele 10 dias mais tarde, e ele vai querer cancelar / reverter a transação específica, sem alterar outros.

Como posso fazê-lo graciosamente no nível de aplicação?

Publicado 09/12/2008 em 15:08
fonte usuário
Em outras línguas...                            


7 respostas

votos
2

Você poderia usar uma abordagem de revisão para cada registro que você deseja rastrear. Isso envolveria manter uma linha em sua tabela para cada revisão de um registro. Os registros seriam ligados por um 'ID' compartilhado e pode ser consultado no 'Status Revisão' (por exemplo Obter o mais recente "Aprovado" record).

Em sua camada de aplicativo, você pode lidar com esses registros individualmente e reverter para um estado anterior, se necessário, contanto que você gravar todas as informações necessárias.

[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
Respondeu 09/12/2008 em 16:40
fonte usuário

votos
2

Martin Fowler abrange o tema em padrões para coisas que mudam com o tempo . Ainda padrões e não um quadro real, mas ele mostra dados de exemplo e como usá-lo.

Respondeu 09/12/2008 em 16:19
fonte usuário

votos
1

ponto pedante. Seu exemplo conta bancária não iria passar por um auditor / regulador.

Quaisquer entradas erradas em uma conta deve ser deixado lá para o registro. Uma transação igual e oposta a correção seria aplicado à conta. Com efeito reverter a transação original, mas deixando um rastro muito óbvia do erro original e sua correção.

Respondeu 09/12/2008 em 16:05
fonte usuário

votos
0

Eu não estou ciente de um padrão específico, apesar de eu ter criado histórias undo / auditoria completas antes de usar gatilhos e rowversions.

Há um par de aplicativos para MS SQL que permitem que você arrasto através dos logs e ver as alterações atuais.

Eu usei um chamado Log Navigator com o MS SQL 2000 que é utilizado para deixe-me desfazer uma transação histórica específica - Eu não posso encontrá-lo agora embora.

http://www.lumigent.com e http://www.apexsql.com fazer ferramentas para exibir os logs, mas eu não acho que nenhum permite revertê-las.

Acho que a melhor maneira de fazer isso é escrever a sua aplicação com isso em mente - o que você tem um par de boas sugestões aqui já sobre como fazer.

Respondeu 10/12/2008 em 11:20
fonte usuário

votos
0

Com base nos vários comentários uma possível solução para o seu problema seria fazer uma tabela "data efetiva".

Basicamente você adicionar colunas válidas-de-data e válidas-se atualizado a cada mesa.

O registro "atual" deve sempre ter um valid_to_date de "2999/12/31" ou algum arbiteraly alto valor. Quando um valor muda de alterar a uma nova linha "válido-to-date" para a data atual e inserir com um válido-de-data de hoje e um válido-to-date de "2999-12-31" copiar todo o colunas da linha antiga, caso não tenham sido alteradas.

Você pode criar pontos de vista com "selecionar todas as colunas, exceto válido-xx-data a partir da mesa onde válida-to-date =" 2999/12/31"

O que permitirá que todas as suas consultas atuais para trabalhar inalterado.

Esta é uma tecnique muito comum em ambientes de data warehouse e para a coisa como taxas de câmbio, onde a data efetiva é importante.

A lógica de desfazer deveria ser óbvio.

Respondeu 10/12/2008 em 11:07
fonte usuário

votos
0

Eu iria com um design de banco de dados bi-temporal, que iria dar-lhe todos os dados necessários para realizar e reversão, mesmo que isso signifique inserir mais linhas ou simplesmente apagar as modificações posteriores.

Há uma boa quantidade de sutileza para tal projeto de banco de dados, mas há são muito bom livro sobre o assunto:

Desenvolvimento orientados para o Tempo Aplicações de banco de dados em SQL por Richard T. Snodgrass

disponível para download aqui:

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

Usando uma transação de banco de dados seria uma má idéia, porque as fechaduras seria criar no banco de dados - basicamente as operações de banco de dados deve ser o mais curto possível.

Qualquer coisa na camada de aplicação, a menos que tenha algum mecanismo de persistência em si, não vai sobreviver aplicação reiniciar (embora isso possa não ser uma exigência).

Respondeu 09/12/2008 em 18:02
fonte usuário

votos
0

Com base no seu comentário a James Anderson, eu teria a interface de utilizador escrever uma nova pastilha ao cancelar uma transação. Seria inserir um novo registro na tabela que tinha os mesmos valores que a transação cancelada, exceto o valor seria um número negativo, em vez de um número positivo. Se você tem uma estrutura que inclui algo para definir o propósito da operação, eu iria fazê-lo dizer cancelada e o número de registro da transação que estava cancelando.

Respondeu 09/12/2008 em 17:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more