1
resposta

triggers mais complexas no sql server

minha dúvida é como eu posso fazer uma trigger que incluir dados em tabela de log onde a descrição mostra o dado antigo e o novo.

create table tblog( id int identity(1,1), descricao varchar(150) );

create table pessoa( id int identity(1,1), nome varchar(20), senha varchar (20) );

create trigger logpessoa on pessoa after update

as begin

declare @oldsenha varchar(20)
declare @newsenha varchar(20)

select  @oldsenha = senha from deleted


if @oldsenha != @newsenha
insert into tblog (descricao) values ('senha mudada de' + @oldsenha + 'para ' + (select senha from updated ) )

end

tentei declarar o nova senha da mesma forma que a substituida

select  @oldsenha = senha from deleted
select  @newsenha = senha from updated

e no insert colocar assim

if @oldsenha != @newsenha insert into tblog (descricao) values ('senha mudada de' + @oldsenha + 'para ' + @newsenha)

mas também não funcionou. Não consigo achar um material mais específico na internet de como fazer logs mais detalhadas, e na formação de sql server do alura só é passado o básico sobre triggers.

1 resposta

Olá Guilherme, tudo bem? Acho que entendi o que você deseja fazer, porém o primeiro ponto que vejo é que você está criando uma TRIGGER que vai executar depois da atualização ou seja AFTER UPDATE, porém para que você possa ter o dado antigo e o novo, você precisaria usar um TRIGGER que você disparada antes do dado ser realmente salvo na tabela, porém o SQL Server não disponibiliza algo como DEFORE UPDATE, uma alternativa seria você usar o INSTEAD OF para substituir a ação de UPDATE diretamente na tabela para pegar o dado antigo e novo, assim você poderia armazenar esses valores logo em seguida fazer o UPDATE em si na tabela e por fim fazer o INSERT na tabela de logs.

Fala pra mim se entendeu a ideia!