Auditoria
04/12/2015 18:32
1
Estimados,
  Pesquisando sobre como gravar o histórico de modificações de alguns dados chave da aplicação, a 1° opção foi o plugin audit logging entretanto este plugin cria uma única tabela para armazenar mudança de todas as domains auditáveis e armazena 1 registro por atributo modificado, isso vai me gerar uma tabela gigantesca e complexa de manipular, ai surgiu a ideia de criar uma tebela minha_domain_log para cada domain auditável e cada registro desta tabela teria id, JSON (string representando a domian completa), id_objeto data e responsável. Isso permite uma organização melhor das informações de log de modificações mas deixaria o processo de interpretação destes dados mais difícil (teria que recuperar todos os dados de um id_objeto, compara-los para descobrir o que mudou a cada registro) pois o objeto é bem complexo (um JSON que peguei de exemplo tem 7400 caracteres, mas este valor pode ser maior).
  Alguém utiliza este plugin? O que acham dessa abordagem sugerida? Alguma outra ideia?

Grato,
Tags: Grails, Auditoria


1
Oi Dyego,
busque por Hibernate Envers. Faz exatamente o que você quer e, se não me engano, existe inclusive um plug-in pra Grails que já te dá tudo pronto.


0
Não conhecia esse hibernate envers, muito interessante
Como ele lida com alterações no schema?


0
Oi Magno,

na realidade ele vai duplicar suas tabelas: haverá uma para os seus dados originários e outro para as informações de auditoria. Se alterar os dados da tabela, a de auditoria é alterada junto.
Sobre histórico de alterações de estrutura de banco de dados, é melhor usar o plugin migrations mesmo, que te atende bem também.


0
Certo, mas usando o migrations ele automaticamente migra as tabelas de auditoria?
Ou tenho que fazer o migration duplicado? (Cada operação eu faço na tabela real e na tabela de auditoria)


0
Oi Magno,

nunca usei os dois em conjunto. Mas em teoria as tabelas de auditoria são alteradas de forma automatica.


0
Valeu Henrique,
  Este Hibernate Envers está mais próximo do que preciso!
08/12/2015 11:45


0
? Prezados,No meu projeto atual tenho a necessidade de implementar um sistema de auditoria, semelhante ao Dyego. Assim como o mesmo, verifiquei o plugin audit-logging (que cria uma tabela para cada alteração, criação, deleção, enfim, modificações em domains mapeadas)  que no entanto, não atende as necessidades do projeto.Conforme recomendação decidi adotar o Hibernate Envers, intermediado pelo grails plugin ?"org.grails.plugins:envers:2.1.0". Basicamente, funcionando por meio de annotations, o Envers mapea as domains anotadas com a annotation @Audited. Cria uma tabela clone no banco de dados semelhante a tabela da domain original mas com adição de um sufixo "_aud" (por padrão). Também cria uma tabela padrão "revinfo".No entanto, (contrariando a documentação oficial) o Envers aparentemtne não faz o mapeamento automático das relações que as domains anotadas possuem, retornando erro de execução (algo como: há uma relação de uma domain auditável com uma não auditável, não foi possível injetar beans),  sendo necessário adicionar annotations @Audited em todas as domains que se deseja fazer auditoria ou que possuam relações com as primeiras. Em um efeito cascata, acabei anotando como auditáveis aproximadamente 105 domains que possuíam relações (ou estavam relacionadas a domains que possuíam relações) com a minha domain inicial.No meu caso, necessitei mapear uma domain exemplo "A" que possuía "n" relações, entre elas com a domain "B":@Auditedclass A {?// Relacionamento direcional de A para B?B myObject;}class B {?//Quaisquer atributos com vários outros relacionamentos}E de forma bastante peculiar, senão, estranha, a solução para este problema de ignorar uma relação é adicionar a annotation @NotAudited explicitamente ao getter da classe na qual a sua domain a ser auditada possui relação, nesse caso, B. Declarei este metodo na domain A da seguinte maneira:?@Auditedclass A {?// Relacionamento direcional de A para B?B myObject;?//Vários outros parâmetros, definições? e relacionamentos?hasMany = {myObjectC:C, ?myObjectD:D}???// Solução aparente é declarar o getter das domains com relacionamento explicitamente e adicionar annotation @NotAudited?@NotAudited?def getB () {myObjectB}??@NotAudited??def getC () {myObjectC} // Também funciona para relacionamentos declarados dentro da lista hasMany (GORM)}Misteriosamente, a documentação oficial não menciona tal caso em nenhum ponto. Como também não menciona que ao anotarmos B como sendo não-auditável "@NotAudited" ocorre um erro na declaração de TYPE.Necessito auditar a classe A e o seu relacionamento com B por meio de uma referencia. É possível fazer isto? Em outras palavras, desejo auditar A, seus atributos, e seu relacionamento com B. Uma vez que B pode mudar e A ter uma relação com outro B. Mas não desejo auditar B, nem seus atributos.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto