none
Trigger SQL RRS feed

  • 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  
    


    quarta-feira, 28 de março de 2012 21:11

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

    quinta-feira, 29 de março de 2012 12:50
  • 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.

    quinta-feira, 29 de março de 2012 13:52
  • 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]

    quinta-feira, 29 de março de 2012 14:26
  • 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.

    quinta-feira, 29 de março de 2012 20:48
  • 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

    segunda-feira, 9 de abril de 2012 11:09