Para requisitos regulatórios e de fraude, precisamos registrar todas as alterações na maioria das tabelas no banco de dados. A maneira como fizemos isso com muito sucesso em um projeto anterior é ter uma cópia de cada tabela, idêntica, exceto que:
- 4 colunas adicionais: DateChanged, UserId, Action (Create, Update, delete) e IP
- O Id pk não é mais único.
- todas as outras restrições (FK, índices exclusivos, etc.) foram removidas.
- as tabelas de auditoria estão em um esquema de auditoria separado
Em um job anterior, os DBAs Oracle escreveram um script para gerar tudo isso automaticamente, fizeram o seguinte:
- Criou um novo esquema chamado audit se não existir
- Itere sobre cada tabela t no esquema normal:
- criou uma nova tabela no esquema de auditoria com o mesmo nome de tabela, exceto prefixado com a_, por exemplo, a_t
- Adicionadas todas as mesmas colunas da tabela original, mais as 4 colunas adicionais (DateChanged, UserId, IP Address e Action)
- gatilhos gerados e adicionados à tabela original (se ainda não estiverem lá) para:
- Se estiver atualizando, escreva uma nova linha na tabela a_ correspondente, com ação de "Atualizar" contendo os valores pré-atualizados (antigos) em todas as colunas (a tabela principal terá os novos valores)
- Se estiver excluindo, adicione uma linha que seja uma cópia da linha da tabela principal, mas ação = "Excluir".
- Se inserir, adicione a linha ao esquema de auditoria
NOTA:
- Todas as tabelas possuem um ID PK.
- Algumas tabelas precisam ser excluídas para desempenho ou porque não são necessárias (por exemplo, a tabela de saldo que é atualizada por um gatilho)
A beleza desse sistema é que você pode consultar o que mudou e quando, ou quem fez alterações no quê, e ver o registro antes e depois da alteração. as alterações estão no nível da linha do banco de dados, não no nível da coluna individual.
Alguém já se deparou com algo assim para MYSQL 5.6? Não temos um DBA em nossa equipe que poderia escrever algo assim do zero, mas sabemos o suficiente para modificar algo semelhante.
Acabei de escrever isso hoje cedo. É uma instrução select funcionando no banco de dados information_schema, que produz o esquema para as tabelas de auditoria e os gatilhos.
A resposta de Vanyo quase funcionou para mim. Foi bom quando movi o backtick nas referências
NEW
eOLD
(então, em vez de`NEW.column1`
eu receboNEW.`column1`
):