Inquiridor
Trigger SQL

Pergunta
-
Olá,
estou tentando montar uma trigger para verificar se um dado em uma tabela foi alterado. Se sim, quero gravar os dados antigos e alguns dados novos em uma tabela que criei. Porém não estou conseguindo. Alguém pode dar uma forcinha?
segue a trigger abaixo:
USE [CORPORERM_TESTE] GO /****** Object: Trigger [dbo].[TG_MOVIMENTACAO_PFUNC] Script Date: 03/28/2012 08:34:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Renan -- Create date: <26/03/2012> -- Description: Trigger para buscar a movimentação dos funcionários (demissão e tranferência) -- ============================================= ALTER TRIGGER [dbo].[TG_MOVIMENTACAO_PFUNC] ON [CORPORERM_TESTE].[dbo].[PFUNC] FOR UPDATE AS IF( Update(codsituacao) AND Update(dtdesligamento) ) BEGIN INSERT INTO de_sgi.dbo.rm_movimentacao_pfunc (cod_coligada, cod_secao, chapa, nome_func, cod_situacao, cod_tipo, cod_funcao, dt_admissao, dt_demissao, tipo_demissao, motivo_demissao, dt_desligamento) SELECT deleted.codcoligada, deleted.codsecao, deleted.chapa, deleted.nome, deleted.codsituacao, deleted.codtipo, deleted.codfuncao, deleted.dataadmissao, deleted.datademissao, deleted.tipodemissao, deleted.motivodemissao, deleted.dtdesligamento FROM deleted, inserted WHERE deleted.codsituacao = 'D' END
Todas as Respostas
-
Bom dia Renan,
Qual o erro que esta ocorrendo?
Você precisa pegar dados das tabelas deleted e inserted mas neste exemplo acima só esta pegando dados da tabela deleted.
se não estiver inserindo dados na tabela rm_movimentacao_pfunc tente tirar a clausula where do select ( deleted.codsituacao = 'D' ). )
Qualquer probema posta ai.
Abçs
Adriano Nascimento
-
já tentei pegar das duas tabelas, mas não consegui o que quero.
na verdade que os dados antigos e alguns dados novos para salvar na tabela rm_movimentacao_pfunc.
salvando já está mas, ou salva somente os antigos, ou somente os novos. não estou conseguindo pegar os dois.
identifiquei que através da clausula deleted.codsituacao = 'D' ou deleted.codsituacao = 'A' eu defino se pego os novos ou os velhos. se eu deixar sem a clausula, pego os dois, porem gravo dois registros na minha tabela e quero gravar todos os dados em um só registro.
-
Renan,
A posição em relação aos dados antigos vai estar disponível dentro da transação que processou o trigger na tabela Deleted.
Já os novos dados você vai encontrar dentro da tabela Inserted, dentro da transação que o trigger esta sendo processo.
Vale ressaltar que o trigger é procedimento transacional e seus dados só vai existir dentro do período em que a transação que chamou o trigger estiver sendo executada.
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]
-
Pedro,
estou com problema justamente aí. eu tinha lido que os conceitos das tabelas Deleted e Inserted eram esses mesmos, mas eu estava buscando os valores antigos na Inserted. não sei o que fiz de errado.
E o outro problema é colocar os dois dados (antigo e novo) de um registro em um unico registro da tabela rm_movimentacao_pfunc.
-
Bom dia Renan,
Fiz um teste com a trigger abaixo e aparentemente deu tudo certo.
Logou as informações do que foi e do que esta sendo alterado em uma única linha de registro.
Veja se o exemplo abaixo te ajuda.
ALTER TRIGGER [TG_MOVIMENTACAO_PFUNC] ON [dbo].[PFUNC] FOR UPDATE AS IF( Update(codsituacao) AND Update(dtdesligamento) ) BEGIN INSERT INTO rm_movimentacao_pfunc (cod_coligada, cod_secao, chapa, nome_func, cod_situacao, cod_tipo, cod_funcao, dt_admissao, dt_demissao, tipo_demissao, motivo_demissao, dt_desligamento) SELECT d.codcoligada, d.codsecao, d.chapa, d.nome, i.codsituacao, d.codtipo, d.codfuncao, d.dataadmissao, d.datademissao, d.tipodemissao, d.motivodemissao, i.dtdesligamento FROM deleted d INNER JOIN inserted i on d.codcoligada = i.codcoligada END GO
Abçs,
Adriano Nascimento
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:19