Eu tenho um banco de dados ms-access no trabalho que possui uma tabela que é um log de transações.
A tabela contém os seguintes campos:
Data - A data em que a transação ocorreu.
- Table_Name - Nome da tabela na qual o campo foi alterado.
- Table_Field - O campo na tabela que foi alterado.
- Old_Value - O valor original do campo (se houver).
- New_Value - O novo valor do campo que foi definido durante esta transação.
Agora, em uma tabela de log de transações como esta, esses registros normalmente são definidos pela API de programação do sistema que modifica o banco de dados, uma função do próprio banco de dados ou são acionados por algo como um gatilho de banco de dados? Ou isso depende do rdbms que está sendo usado?
Em primeiro lugar, o termo correto para isso é tabela de auditoria (ou talvez histórico de auditoria). O log de transações é algo totalmente diferente (que é uma parte central do DBMS que registra todas as transações ativas para garantir as propriedades ACID) - o log de transações do DBMS (que está em um formato binário muito difícil de ler) é reutilizado uma vez que é não é mais necessário ("uma vez que não é mais necessário" é um pouco vago, mas uma dissertação completa sobre a semântica do log de transações está um pouco além do escopo desta resposta), onde um histórico de auditoria permanece para sempre, contanto que você não limpe a mesa.
Para responder à pergunta real - isso deve ser feito dentro do banco de dados (os gatilhos são a maneira mais fácil). A razão básica para isso é que você deseja que qualquer coisa que seja parte integrante dos dados (ou seja, restrições, regras de segurança, histórico de auditoria etc.) aconteça, não importa qual aplicativo esteja usando o banco de dados.
Adicionalmente:
Old_Value
e ?New_Value
Person(ID, Name)
, teráaudit_Person(whoChanged, whenChanged, ID, Name)
, e, em atualização ou exclusão, armazene o estado da linha antes da alteração (não precisa inserir porque basta procurar na tabela o estado atual), juntamente com o login do usuário que a alterou e a hora.Person
, também precisará adicioná-la a 'audit_Person') e possivelmente sendo maior em geral do que a abordagem de tabela única.