Existe alguma biblioteca / quadro de mudanças undo / redo de linhas no banco de dados?
-
20-08-2019 - |
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?
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
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