![]() |
||||||||
|
|
||||||||


| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

|
||||||||||||||||||||||||||||||||||||||||||||
Pesquisa personalizada
Quer
saber mais? Criando uma auditoria de dados com SQL Server É muito comum que um sistema tenha necessidade de criar informações de auditoria, para que se tenha conhecimento de quando foi feita e quem fez a ultima modificação em um determinado registro. A primeira opção que os programadores utilizam é fazer essa atualização por código. O problema disso é simples de entender : Está sendo mantida uma regra de negócio no client. Assim sendo, fica-se vinculado a todos os problemas de manutenção de uma regra de negócios no client, a saber :
Supondo que temos uma tabela chamada "tabteste" com os campos de auditoria criados como "usuario" e "dataAlterado" e um campo chave chamado código. Vejamos um exemplo de uma tabela :
Os mais observadores irão notar que a aplicação ainda terá que lidar com a existência de dois campos adicionais na tabela. Para contornar isso, basta que a aplicação esteja utilizando uma view. Veja :
Mas estz solução, comum até a versão 7 do SQL Server, tem um ponto fraco : O Trigger faz uma atualização na própria tabela na qual ele está rodando. Assim sendo, ao fazer essa atualização ele seria chamado novamente, e assim continuamente, entrando em loop. Será mesmo ? Entre as opções de um banco de dados no SQL Server vocês encontram a opção recursive triggers. Sabendo o perigo do loop dentro de um trigger a Microsoft transformou isso em uma opção configuravel dentro do banco de dados : Quando recursive triggers está marcado o trigger pode chamar ele mesmo. Quando não está, não pode. Menos mal. Se recursive triggers estiver desmarcado o trigger acima funciona, se estiver marcado não (entra em loop). Só isso já manteria o Trigger funcionando, mas sejamos perfeccionistas : Depender de uma configuração do banco que pode ou não estar setada pode nos causar problemas. Se algum desavisado ativar a opção Recursive Triggers, ao rodar um insert equivalente ao que mostramos acima teremos o seguinte erro :
Temos então duas opções :
@@NestLevel A variável @@Nestlevel contém um número que indica o nível de recursividade que o trigger já sofreu. Se estiver em 0, então ainda não passou por recursividade alguma. Assim sendo, podemos só fazer o update quando o @@Nestlevel for 0. Continuaremos tendo duas chamadas do trigger, mas na segunda ele não irá fazer nada e consequentemente parará a recursividade. Veja como fica nosso Trigger :
Com este trigger não importa mais a configuração da opção Recursive Triggers : Se estiver desmarcada, o trigger roda apenas uma vez Instead Of No SQL Server 2000, porém, o problema pode ser resolvido de uma forma melhor. Existe um tipo especial de trigger chamado trigger de Instead. Este trigger não acontece após o evento (insert,update), mas em substituição ao evento. Assim sendo, o insert e o update não serão feitos pelo SQL Server, o trigger é que deverá decidir se irá faze-los ou não. Esse tipo de trigger não sofre recursividade (um update feito pelo trigger não dispara novamente o trigger) e consequentemente resolve nosso problema. Precisaremos porém de 2 triggers de Instead : Um de Update e outro de Insert, não podemos mais fazer as 2 operações no mesmo código. Veja o trigger de Instead para Insert :
Para o trigger de update teremos que fazer um update relacionando as duas tabelas : A tabela inserted e a tabela tabteste. Veja como fica :
Desta forma resolvemos de forma simples e confiável o problema de auditoria em alterações de dados utilizando os recursos do servidor. Dennes Torres |
||||||||||||||||||||||||||||||||||||||||||||
|
Veja abaixo os comentários já enviados :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
||||||||||||||||||||||||||||||||||||||||||||
© Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 • Cinelândia • Rio de Janeiro • RJ
Tel.: (21)2262-1368 • e-Mail: contato@bufaloinfo.com.br