Usuário com melhor resposta
trigger

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_IMPORTADOSON CONTROLE_DADOS_IMPORTADOSFOR UPDATEASDECLARE @NUM_ERROR INTDECLARE @MSGERROR VARCHAR(255)INSERT INTO TB_LOGSGI(CDI_CDICODIGO,CDI_CDI_QTDROWS_PROCESSADOS,CDI_CDI_QTDROWS_RECEBIDOS,DATAENTRADA)SELECTCDIORI.CDI_CODIGO,CDIORI.CDI_QTDROWS_PROCESSADOS,CDIORI.CDI_QTDROWS_RECEBIDOS, getDate()FROM TB_CONTROLE_DADOS_IMPORTADOS CDIORIINNER JOIN INSERTED ION I.CDI_CODIGO = CDIORI.CDI_CODIGO
Respostas
-
Pessoal eu ja arrumei..segue a solução:ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOSON TB_CONTROLE_DADOS_IMPORTADOSAFTER UPDATEASDECLARE @NUM_ERROR INTDECLARE @MSGERROR VARCHAR(255)DECLARE @CDI_CODIGO_NOVO INTDECLARE @CDI_CDI_QTDROWS_PROCESSADOS_NOVO INTDECLARE @CDI_QTDROWS_RECEBIDOS_NOVO INTDECLARE @DATA DATETIMEIF UPDATE(CDI_QTDROWS_RECEBIDOS)BEGINSET NOCOUNT ONSELECT@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 IINSERT 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
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 SnippetALTER
TRIGGER [dbo].[T_Atualizar_Analise_Resultados]ON
[dbo].[CTENTRADA_PQC]AFTER
UPDATEAS
SET NOCOUNT ONDECLARE @NUMMP CHAR(7),
@NUMCADASTRO
INTSET @NUMMP=(SELECT NUMMP FROM INSERTED)
SET @NUMCADASTRO = (SELECT NUMCADASTRO FROM DELETED)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 -
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 ?
-
-
Ola esse conceito eu conheço junior mas a minha duvida é outra.Segue o codigo abaixo:
ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOSON TB_CONTROLE_DADOS_IMPORTADOSFOR UPDATEASDECLARE @NUM_ERROR INTDECLARE @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 IQuando 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 postarMuito obrigado -
Pessoal eu ja arrumei..segue a solução:ALTER TRIGGER TG_CONTROLE_DADOS_IMPORTADOSON TB_CONTROLE_DADOS_IMPORTADOSAFTER UPDATEASDECLARE @NUM_ERROR INTDECLARE @MSGERROR VARCHAR(255)DECLARE @CDI_CODIGO_NOVO INTDECLARE @CDI_CDI_QTDROWS_PROCESSADOS_NOVO INTDECLARE @CDI_QTDROWS_RECEBIDOS_NOVO INTDECLARE @DATA DATETIMEIF UPDATE(CDI_QTDROWS_RECEBIDOS)BEGINSET NOCOUNT ONSELECT@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 IINSERT 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