Usuário com melhor resposta
Trigger para Controle de Log com varios campos

Pergunta
-
Prezado(a)s depois de fazer alguns levantamentos sobre o assunto cheguei a conclusao de que para melhor controlar as alterações de campos de uma tabela seria por Triggres. Bom, no primeiro momento fiz para uma tabela pequena (um campo) e funcionou. Agora estou com uma tabela maior, contrui a trigger da forma que achava correto, porem o resultado foi decepcionante. Gostaria de que ao salvar a tabela a trigger verificaria quais campos foram alterados e inserisse na tabel, porem da forma que fiz ele sempre vai alterar tudo. Segue abaixo a Tabela e a trigger feita, que puder me ajudar
TABELA
create table ControleLog.Empresalog (
IdEmpresaLog int identity constraint pk_IdEmpresaLog primary key,
IdEmpresa int not null constraint fk_IdEmpresaLog references Pessoa.Empresa(IdEmpresa),
IdRegiaoDe int,
IdRegiaoPara int,
IdAtividadeRamoDe int,
IdAtividadeRamoPara int,
IdPatronalDe int,
IdPatronalPara int,
NumFuncionariosDe int,
NumFuncionariosPara int,
IdContabilidadeDe int,
IdContabilidadePara int,
FormaPagamentoDe int,
FormaPagamentoPara int,
DataBaseSindicalDe int,
DataBaseSindicalPara int,
DataAlteracaoEmpresaLog datetime not null,
IdUsuarioAlteracao int not null
)
goTrigger
create trigger trg_EmpresaLog on Pessoa.Empresa for update
as Begin
Declare
@IdEmpresa int,
@IdRegiaoDe int,
@IdRegiaoPara int,
@IdAtividadeRamoDe int,
@IdAtividadeRamoPara int,
@IdPatronalDe int,
@IdPatronalPara int,
@NumFuncionariosDe int,
@NumFuncionariosPara int,
@IdContabilidadeDe int,
@IdContabilidadePara int,
@FormaPagamentoDe int,
@FormaPagamentoPara int,
@DataBaseSindicalDe int,
@DataBaseSindicalPara int;
Select --Campos que serão alterados
@IdRegiaoDe = IdRegiao,
@IdAtividadeRamoDe = IdAtividadeRamo ,
@IdPatronalDe = IdPatronal ,
@NumFuncionariosDe = NumFuncionarios,
@IdContabilidadeDe = IdContabilidade ,
@FormaPagamentoDe =FormaPagto ,
@DataBaseSindicalDe = DataBaseSindical
from
deleted ;
Select
@IdEmpresa = IdEmpresa,
@IdRegiaoPara = IdRegiao,
@IdAtividadeRamoPara = IdAtividadeRamo,
@NumFuncionariosPara =NumFuncionarios ,
@IdContabilidadePara = IdContabilidade ,
@FormaPagamentoPara = FormaPagto ,
@DataBaseSindicalDe = DataBaseSindical
from
inserted ;
if (@IdRegiaoDe <> @IdRegiaoPara) or
(@IdAtividadeRamoDe <> @IdAtividadeRamoPara) or
(@IdPatronalDe <> @IdPatronalPara) or
(@NumFuncionariosDe <> @NumFuncionariosPara) or
(@IdContabilidadeDe <> @IdContabilidadePara) or
(@FormaPagamentoDe <> @FormaPagamentoPara) or
(@DataBaseSindicalDe <> @DataBaseSindicalPara)
Insert into ControleLog.Empresalog (
IdEmpresa,
IdRegiaode,
IdRegiaoPara ,
IdAtividadeRamode,
IdAtividadeRamoPara ,
IdPatronalDe,
IdPatronalPara,
NumFuncionariosDe,
NumFuncionariosPara,
IdContabilidadeDe,
IdContabilidadePara ,
FormaPagamentoDe ,
FormaPagamentoPara ,
DataBaseSindicalDe ,
DataBaseSindicalPara ,
DataAlteracaoEmpresaLog ,
IdUsuarioAlteracao
)
Values(
@IdEmpresa ,
@IdRegiaoDe ,
@IdregiaoPara,
@IdAtividadeRamoDe ,
@IdAtividadeRamoPara ,
@IdPatronalDe ,
@IdPatronalPara ,
@NumFuncionariosDe ,
@NumFuncionariosPara ,
@IdContabilidadeDe ,
@IdContabilidadePara ,
@FormaPagamentoDe ,
@FormaPagamentoPara ,
@DataBaseSindicalDe ,
@DataBaseSindicalPara ,
GETDATE(),
1
)
end
goContando com a atenção de sempre
Marcelo Nogueira
Respostas
-
Boa Noite,
Recomendo intensificar os levantamentos, pois, triggers talvez não sejam a melhor forma de fazê-lo caso você esteja no SQL Server 2008. O recurso de Change Data Capture é muito mais eficaz no que você está procurando.
A trigger ainda tem problemas, pois, se mais de um registro for alterado, ela não irá pegar todos por conta da atribuição de variáveis. Recomendo ler o artigo abaixo:
Piores Práticas – Elaborar triggers preparadas para linhas e não para conjuntos
http://gustavomaiaaguiar.wordpress.com/2010/01/30/piores-praticas-%E2%80%93-elaborar-triggers-preparadas-para-linhas-e-nao-para-conjuntos/[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Marcado como Resposta Marcelinho FaberCode quarta-feira, 30 de novembro de 2011 14:05
Todas as Respostas
-
Marcelinho,
Qual é a versão do seu SQL Server, se estiver utilizando o 2008 poderíamos pensar em trabalhar com o objeto Audit.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com] -
Boa Noite,
Recomendo intensificar os levantamentos, pois, triggers talvez não sejam a melhor forma de fazê-lo caso você esteja no SQL Server 2008. O recurso de Change Data Capture é muito mais eficaz no que você está procurando.
A trigger ainda tem problemas, pois, se mais de um registro for alterado, ela não irá pegar todos por conta da atribuição de variáveis. Recomendo ler o artigo abaixo:
Piores Práticas – Elaborar triggers preparadas para linhas e não para conjuntos
http://gustavomaiaaguiar.wordpress.com/2010/01/30/piores-praticas-%E2%80%93-elaborar-triggers-preparadas-para-linhas-e-nao-para-conjuntos/[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Marcado como Resposta Marcelinho FaberCode quarta-feira, 30 de novembro de 2011 14:05