none
trigger RRS feed

  • Pergunta

  • Boa tarde comunidade.
    Tenho uma duvida e gostaria q alguém me tirasse esta duvida.

    E o seguinte fiz uam trigger que será acionada quando uma tabela for atualizada por uma proc que tenho aqui na empresa.
    Eu pegarei os valores que foram inseridos e colocado em uma tabela de LOG.
    A duvida e a seguinte: Pra fazer o JOIN com a tabela em memoria como ficaria INSERTED ? mesmo q fosse para um UPDATE ? E se o select retornar mais que uma linha ?
    Segue o codigo:

    CREATE TRIGGER TG_CONTROLE_DADOS_IMPORTADOS
    ON CONTROLE_DADOS_IMPORTADOS
    FOR UPDATE
    AS
    DECLARE @NUM_ERROR INT
    DECLARE @MSGERROR VARCHAR(255)


    INSERT INTO TB_LOGSGI
    (
    CDI_CDICODIGO,CDI_CDI_QTDROWS_PROCESSADOS,CDI_CDI_QTDROWS_RECEBIDOS,DATAENTRADA
    )

    SELECT 
    CDIORI.CDI_CODIGO,CDIORI.CDI_QTDROWS_PROCESSADOS,CDIORI.CDI_QTDROWS_RECEBIDOS, getDate()
    FROM TB_CONTROLE_DADOS_IMPORTADOS CDIORI
    INNER JOIN INSERTED I
    ON I.CDI_CODIGO = CDIORI.CDI_CODIGO
    quinta-feira, 2 de outubro de 2008 18:28

Respostas

  • Pessoal eu ja arrumei..segue a solução:
    ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOS
    ON TB_CONTROLE_DADOS_IMPORTADOS
    AFTER  UPDATE
    AS
    DECLARE @NUM_ERROR INT
    DECLARE @MSGERROR VARCHAR(255)

    DECLARE @CDI_CODIGO_NOVO INT
    DECLARE @CDI_CDI_QTDROWS_PROCESSADOS_NOVO INT
    DECLARE @CDI_QTDROWS_RECEBIDOS_NOVO INT
    DECLARE @DATA DATETIME

    IF UPDATE(CDI_QTDROWS_RECEBIDOS)
    BEGIN
    SET NOCOUNT ON
    SELECT 
    @CDI_CODIGO_NOVO = I.CDI_CODIGO,
    @CDI_CDI_QTDROWS_PROCESSADOS_NOVO = I.CDI_QTDROWS_PROCESSADOS,
    @CDI_QTDROWS_RECEBIDOS_NOVO = I.CDI_QTDROWS_RECEBIDOS, 
    @DATA = getDate()
    FROM INSERTED I 

    INSERT INTO TB_LOGSGI(CDI_CDICODIGO,CDI_CDI_QTDROWS_PROCESSADOS,CDI_CDI_QTDROWS_RECEBIDOS,DATAENTRADA)
    VALUES(@CDI_CODIGO_NOVO, @CDI_CDI_QTDROWS_PROCESSADOS_NOVO, @CDI_QTDROWS_RECEBIDOS_NOVO, @DATA)
    END
    quinta-feira, 2 de outubro de 2008 20:56

Todas as Respostas

  • Thiago,

     

    O trigger é um considerado um recurso transacional e por tanto trabalha da mesma forma que os comandos T-SQL, sendo que, cada transação executada pelo SQL Server sobre a table ao qual o trigger esta associado será considerada uma transação sendo assim, o trigger é executado.

     

    Para trabalhar com Join utilizandos as tables triggers Inserted ou Deleted isso é possível somente dentro do próprio bloco transacional do trigger, ou seja, somente dentro dele mesmo.

     

    O que você esta querendo fazer é utilizar um select associado a uma table trigger para retornar um conjunto de dados, mais especificando uma linha?

     

    Se for isso, talvez este exemplo pode ajudar:

     

    Code Snippet

    ALTER TRIGGER [dbo].[T_Atualizar_Analise_Resultados]

    ON [dbo].[CTENTRADA_PQC]

    AFTER UPDATE

    AS

    SET NOCOUNT ON

     

    DECLARE @NUMMP CHAR(7),

            @NUMCADASTRO INT

     

    SET @NUMMP=(SELECT NUMMP FROM INSERTED)

    SET @NUMCADASTRO = (SELECT NUMCADASTRO FROM DELETED)

     

     

    IF @NUMCADASTRO <> (SELECT NUMCADASTRO FROM CTENTRADA_PQC WHERE NUMMP=@NUMMP)

     BEGIN

      DELETE FROM CTENTRADA_PQC_RESULTADOS

      WHERE NUMMP = @NUMMP

     

      INSERT INTO CTENTRADA_PQC_RESULTADOS(NUMMP, CODRELACIONAMENTO,AMOSTRA)

      SELECT PQC.NUMMP,

      MAX(PQCx.CODRELACIONAMENTO) AS CODRELACIONAMENTO,

      PQCx.CODSEQUENCIALMETODO,

      ''

      FROM CTENTRADA_PQC PQC INNER JOIN PQCxME PQCx

                              ON PQC.NUMMP = @NUMMP

                             INNER JOIN PRODUTOSQUIMICOS PQ

                              ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO

                              AND PQC.NUMCADASTRO = PQ.NUMCADASTRO

      GROUP BY PQC.NUMMP, PQCx.CODSEQUENCIALPRODUTO, PQCx.CODSEQUENCIALMETODO

     End

     

     

     

     

    quinta-feira, 2 de outubro de 2008 18:50
  • Não o que acontece e o seguinte.
    Tenho uma proc que atualiza 2 campos de 40 em 40 segundos.
    A minha trigger foi feita com a Ação FOR UPDATE certo ?
    Resumindo: ele so vai ser acionada quando alguem rodar um update na minha tabela.
    A duvida e a seguinte:
    O resultado q eu faço JOIN e da tabela real com a INSERTED. Que acabou de ser inserido.
    Mais na verdade um Update e um INSERT acompanhado de um DELETE....o sql apaga de um lugar e insere em outro.

    DUVIDA: Como a ação e para update tenho q fazer join com a TABELA DELETED E INSERTD ??
    Ou so com a inserte eu tenho o que acabou de ser atualizado na tabela REAL ?
    quinta-feira, 2 de outubro de 2008 19:40
  • Thiago,

     

    A table Inserted armazena os novos dados inseridos.

     

    A table Deleted armazena os dados que estão sendo excluídos ou atualizados.

     

    quinta-feira, 2 de outubro de 2008 20:09
  • Ola esse conceito eu conheço junior mas a minha duvida é outra.
    Segue o codigo abaixo:

    ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOS
    ON TB_CONTROLE_DADOS_IMPORTADOS
    FOR UPDATE
    AS
    DECLARE @NUM_ERROR INT
    DECLARE @MSGERROR VARCHAR(255)


    INSERT INTO TB_LOGSGI
    (
    CDI_CDICODIGO,CDI_CDI_QTDROWS_PROCESSADOS,CDI_CDI_QTDROWS_RECEBIDOS,DATAENTRADA
    )

    SELECT I.CDI_CODIGO,I.CDI_QTDROWS_PROCESSADOS,I.CDI_QTDROWS_RECEBIDOS, getDate()
    FROM INSERTED I

    Quando o JOB que roda de 40 em 40 segundos executa uma proc, essa proc atualiza 2 colunas da tabela TB_CONTROLE_DADOS_IMPORTADOS com a Qtde de Registros que tinha no Servidor X e quanto serão gravados no servidor Y. Na teoria os resultados sempre deve ser iguais das duas colunas.
    O que esta acontecendo:
    Quando eu rodo o select na tabela de LOG(que esta gravando os valores) a cada insert ele esta retornando 2 registro, porque ?
    O primeiro é com um valor e o segundo com o Valor IGUAL das duas colunas, isso deveria ser o certo..mais o outro nao sei porque esta vindo.
    Entederam comunidade..mais duvidas so postar
    Muito obrigado
    quinta-feira, 2 de outubro de 2008 20:24
  • Pessoal eu ja arrumei..segue a solução:
    ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOS
    ON TB_CONTROLE_DADOS_IMPORTADOS
    AFTER  UPDATE
    AS
    DECLARE @NUM_ERROR INT
    DECLARE @MSGERROR VARCHAR(255)

    DECLARE @CDI_CODIGO_NOVO INT
    DECLARE @CDI_CDI_QTDROWS_PROCESSADOS_NOVO INT
    DECLARE @CDI_QTDROWS_RECEBIDOS_NOVO INT
    DECLARE @DATA DATETIME

    IF UPDATE(CDI_QTDROWS_RECEBIDOS)
    BEGIN
    SET NOCOUNT ON
    SELECT 
    @CDI_CODIGO_NOVO = I.CDI_CODIGO,
    @CDI_CDI_QTDROWS_PROCESSADOS_NOVO = I.CDI_QTDROWS_PROCESSADOS,
    @CDI_QTDROWS_RECEBIDOS_NOVO = I.CDI_QTDROWS_RECEBIDOS, 
    @DATA = getDate()
    FROM INSERTED I 

    INSERT INTO TB_LOGSGI(CDI_CDICODIGO,CDI_CDI_QTDROWS_PROCESSADOS,CDI_CDI_QTDROWS_RECEBIDOS,DATAENTRADA)
    VALUES(@CDI_CODIGO_NOVO, @CDI_CDI_QTDROWS_PROCESSADOS_NOVO, @CDI_QTDROWS_RECEBIDOS_NOVO, @DATA)
    END
    quinta-feira, 2 de outubro de 2008 20:56