Pergunta

Pode ser o 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.

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

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

EDIT: Por exemplo, conta bancária transações. 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?

Foi útil?

Solução

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

Outras dicas

Você pode 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 registro mais recente "Aprovado").

Em sua camada de aplicativo, você pode lidar com esses registros individualmente e back roll 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
ponto

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

Todas as entradas errôneas 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.

Com base no seu comentário a James Anderson, eu teria a gravação interface de usuário uma nova inserção 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.

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 quantidade justa de sutileza para tal projeto de banco de dados, mas há são muito bom livro sobre o assunto:

O desenvolvimento orientado a 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 que iria 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).

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

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 o "válido-to-date" para a data atual e inserir um nova linha com a valid-from-data de hoje e um válido-to-date de "2999/12/31" copiar todas as colunas da linha antiga, caso não tenham sido alterados.

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 desfazer deveria ser óbvio.

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 de volta 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, porém

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.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top