Existe algumas notificações de alteração de dados maneira get independente de banco de dados no nível do campo?

StackOverflow https://stackoverflow.com/questions/1221106

  •  10-07-2019
  •  | 
  •  

Pergunta

Atualmente, usando SQL Server 2005, eu consultar um banco de dados "eventos Windows" para determinar mudanças em uma tabela chamada WINDOWS_EVENTS, que tem um campo timestamp. Olhando para o timestamp posso determinar se a linha mudou, mas não o campo nessa linha alterado.

Existe algum (ou seja, base de dados de maneira independente) genérico para detectar mudanças de nível de campo? (Eu preciso que ele seja genérico, porque não há como dizer qual banco de dados um cliente usaria, então eu não quero usar a notificação Services ou outra tecnologia específica SQL-Server-. Eu poderia usar qualquer solução, .NET, Java ou qualquer outra língua se isso me ajuda a resolver o meu problema.)

Foi útil?

Solução

Em primeiro lugar, eu recomendo mudar sua estrutura de tabela a partir de algo como isto:

id      field1   field2   field3   field4   timestamp

em algo parecido com isto:

Table 1
-------
id     fieldKey    value    timestamp
1      1           42       12:03am
2      3           'Cow'    1:45am
3      2           'Moo'    2:33am
4      4           99       3:59am

Table 2
-------
fieldKey     fieldLabel
1            Field One
2            Field Two
3            Event One
4            Event Two

Em segundo lugar, você pode conseguir o que você quer, copiando o valor antigo ou calcular o hash dos valores de campo (para campos de comprimento) e armazená-los em outro campo (oldField1, oldField2, etc.) juntamente com o carimbo de tempo, em seguida, consultar a tabela. Eu acredito que todos os bancos de dados têm uma função hash, como SHA1 ( 'xyz') ou MD5 ( 'abc'), embora possa ter um nome ligeiramente diferente em cada um.

Então, quando você consultar a tabela para mudanças, você vê a linha que mudou, e você pode fazer um campo por comparação de campo para descobrir qual o campo mudou. Então você compararia field1 para oldField1, field2 para oldField2, field3 para oldField3, etc. Para blobs, você poderia comparar SHA1 (field4) para oldField4).

Criar um gatilho procedimento armazenado para copiar os campos quando actualizar o carimbo de tempo.

Outra solução é criar uma tabela log de alterações de dados que armazena apenas mudanças. Seria ser inserido através de um procedimento de gatilho armazenado, e que seria parecido com este

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top