Formas de ter um histórico de mudanças de entradas de banco de dados

14

Quais são as maneiras de permitir o controle de versão das entradas do banco de dados (dados)?

Pense nas habilidades dos sistemas de gerenciamento de conteúdo para reverter as alterações de artigos.

Quais são os seus prós e contras?

    
por matcauthon 10.07.2012 / 07:27
fonte

7 respostas

12

Existem basicamente duas abordagens: uma tabela de auditoria, com todos os valores anteriores armazenados nela, ou incluir uma data de início / término como parte da tabela, e todas as atualizações criam um novo registro enquanto fecham a antiga.

    
por 10.07.2012 / 08:07
fonte
5

A ideia por trás é usar Insert Only Databases . A ideia básica é que você never update or update data on a row. Cada tabela que é necessária para rastrear terá duas colunas datetime de e para.

Eles começam com o valor nulo em cada (início do tempo até o final do tempo)

Quando precisar de change da linha, você adiciona uma nova linha, ao mesmo tempo em que atualiza o para na linha anterior para Agora e o da linha que você está adicionando a Agora.

Para informações mais detalhadas, veja a postagem Qual é o melhor design de banco de dados para o gerenciamento de informações históricas .

    
por 10.07.2012 / 11:51
fonte
2

Eu acho que você pode usar gatilhos para cada tabela e manter os dados em _history (ou você pode dar qualquer nome) e em cada inserção, atualizar, excluir na tabela principal irá acionar o seu gatilho e você pode salvar os detalhes nesta tabela O mecanismo .Trigger também está disponível com o banco de dados SQLite, se você estiver usando um.

Esse mecanismo também é útil para projetos grandes. Nesta tabela, você pode registrar informações do usuário que fez as alterações junto com o registro de data e hora das alterações. você pode restaurar sua tabela para qualquer correspondência de carimbo de data / hora com seus requisitos.

Todo banco de dados tem seu próprio jeito de escrever e codificar gatilhos. Se você estiver usando o SQLite, visite SQLite.org para obter a sintaxe. Para outros bancos de dados, você pode visitar seus sites oficiais.

    
por 10.07.2012 / 13:04
fonte
1

Você provavelmente conhece o mecanismo de db Sqlite . O banco de dados inteiro é salvo em um único arquivo. A API também suporta sistemas de arquivos virtuais, então basicamente você pode organizar o armazenamento em qualquer lugar e com qualquer formato, apenas responder a operações de leitura e gravação em deslocamentos de arquivos específicos. Possíveis aplicativos para isso podem ser criptografia, compactação e assim por diante. A melhor parte de que a camada de contêiner não deve saber nada sobre bancos de dados, formato de arquivo sql ou sqlite, apenas obedeça aos retornos de chamada xRead e xWrite.

Uma das ideias era implementar o recurso de máquina do tempo. Portanto, qualquer operação xWrite salva todos os segmentos sobrescritos no histórico de "desfazer" e o usuário pode escolher uma data no passado para ver o que o db continha (provavelmente o modo somente leitura). Eu não tenho um exemplo de trabalho ainda (houve uma discussão sobre isso em lista de e-mail sqlite), mas provavelmente outros mecanismos fornecem APIs VFS para que algo semelhante seja possível. E uma vez implementado, deve ser compatível com estruturas de banco de dados de qualquer complexidade.

    
por 10.07.2012 / 10:49
fonte
1

O método que usamos para entradas de banco de dados de versionamento é usar uma tabela de auditoria. A tabela tem um esquema ao longo das linhas de:

Seq      - Int      ' Unique identifier for this table
Event    - Char     ' Insert / Update / Delete
TblName  - Char     ' Table that had field value changed
FldName  - Char     ' Field that was changed
KeyValue - Char     ' delimited list of values for fields that make up the PK of table changed
UsrId    - Char     ' User who made the change
OldValue - Char     ' Old value (converted to character)
NewValue - Char     ' New value (converted to character)
AddTs    - DateTime ' When the change was made

Temos então gatilhos em Inserir / Atualizar / Excluir das tabelas que queremos acompanhar.

Prós:

  • Todos os dados estão em uma tabela
  • Pode ser configurado para rastrear todos os campos ou campos específicos em uma tabela
  • Fácil de mostrar a versão em cada campo para uma tabela

Contras:

  • Ter todas as informações de auditoria em uma tabela resulta em um número extremamente grande de registros
  • Muitos gatilhos necessários
por 10.07.2012 / 16:45
fonte
0

Estou fazendo uma versão disso agora. para cada registro eu tenho uma data booleana Inserted Date, Modified date e and Active Record. Para a inserção inicial, as datas Inseridas e Modificadas são definidas como Agora () (Este exemplo está no Access) e o sinalizador de registro Ativo está definido como true . então, se eu modificar esse registro, copio a coisa toda para um novo registro, alterando o (s) campo (s) que o usuário está alterando, deixo a data de Inserção igual à original e altero a data Modificada para Agora (). Em seguida, inverto o sinalizador Active Record do registro original para false e o novo registro para true . Eu também tenho um campo para ModifiedRecordsParentID onde eu salvo a identidade do registro original.

Então, se eu precisar fazer uma consulta, só posso retornar os registros em que ActiveRecord = true e eu só obteremos as informações mais atualizadas.

    
por 10.07.2012 / 13:57
fonte
0

também, se você quiser armazenar TODAS as alterações no banco de dados ao longo do tempo, talvez queira verificar o registro em log ( link )

    
por 11.06.2015 / 03:02
fonte