none
Dúvida como criar uma Trigger RRS feed

  • Pergunta

  • Senhores eu preciso criar uma Trigger que faça o seguinte.

    Tenho uma tabela chamada Pessoa e outra chamada Categoria
    Sempre que for ocorrer uma inclusão na tabela Pessoa eu preciso incluir na tabela Categoria o ID desta pessoa e uma descrição. Não tenho idéia de como recuperar este ID para fazer a inclusão, pensei em utilizar o MAX mas não acho legal, como faço esta Trigger.
    Muito obrigado
    quarta-feira, 29 de abril de 2009 19:31

Respostas

  • Eduardo,

    Veja se este exemplo ajuda:

    ALTER TRIGGER [dbo].[T_Formatar_NumeroRecebimento]
     On [dbo].[CTENTRADA_RECEBIMENTO_LATEX]
     After Insert
    As
     Declare @CodSequencial Int,
                @NumCadastro VarChar(7)
    
    
     Set @CodSequencial=(Select Max(CodSequencial) From Inserted Where Year(DataControle)=Year(GetDate()))
     Set @NumCadastro=(Select NumCadastro From Inserted Where CodSequencial = @CodSequencial And Year(DataControle)=Year(GetDate()))
    
     Update CTEntrada_Recebimento_Latex
      Set Status_Produto=(Select Status_Produto From CTEntrada_Cadastro_Latex
                                     Where NumCadastro=@NumCadastro)
      Where CodSequencial=@CodSequencial
      And    Year(DataControle)=Year(GetDate())
    
     DECLARE @NUMMP CHAR(7)
     SET @NUMMP=(SELECT NUMMP FROM CTENTRADA_PQC_REVALIDACAO 
                           WHERE CODSEQUENCIAL=(SELECT MAX(CODSEQUENCIAL) FROM CTENTRADA_PQC_REVALIDACAO))
     
      INSERT INTO CTENTRADA_PQC_RESULTADOS_REVALIDACAO(NUMMP, NUMREVALIDACAO, CODRELACIONAMENTO, CODSEQUENCIALPRODUTO, CODSEQUENCIALMETODO, AMOSTRA)
        SELECT PQC.NUMMP, 
                   MAX(PQC.NUMREVALIDACAO)+1 AS NUMREVALIDACAO,
                   MAX(PQCx.CODRELACIONAMENTO) AS CODRELACIONAMENTO,
                   PQCx.CODSEQUENCIALPRODUTO,
                   PQCx.CODSEQUENCIALMETODO,
                   ''
        FROM CTENTRADA_PQC_REVALIDACAO PQC INNER JOIN PQCxME PQCx
                                ON PQC.NUMMP = @NUMMP
                           INNER JOIN PRODUTOSQUIMICOS PQ 
                                ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                AND PQC.NUMCADASTRO = PQ.NUMCADASTRO   
                                AND PQCx.CODRELACIONAMENTO = (SELECT MAX(PQCx.CODRELACIONAMENTO) FROM PQCxME PQCx INNER JOIN PRODUTOSQUIMICOS PQ
                                             ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                                                                 WHERE PQ.NUMCADASTRO = PQC.NUMCADASTRO)
           GROUP BY PQC.NUMMP, PQCx.CODSEQUENCIALPRODUTO, PQCx.CODRELACIONAMENTO, PQCx.CODSEQUENCIALMETODO, PQCx.CODSEQUENCIAL
           ORDER BY PQCx.CODSEQUENCIAL
    

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 29 de abril de 2009 19:38

Todas as Respostas

  • Caro,

     No disparo da trigger, internamente vai existir a tabela INSERTED, você pode dar um select nela para recuperar os ids dos registros inseridos.

    Abraços
    Gilberto Neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    • Sugerido como Resposta Gilberto Neto quarta-feira, 29 de abril de 2009 19:36
    quarta-feira, 29 de abril de 2009 19:35
  • Ola Eduado..

    Segue um exemplo com a tabela INSERTED conforme o gilberto mencionou.

    create table tab1 (id int identity(1,1), nome varchar(20))
    go
    create table tab2 (id int)
    go
    
    create trigger trg_tab1 on tab1 for insert
    as
    insert into tab2 
    select id from inserted
    
    
    
    insert into tab1 values('teste')
    
    select * from tab1
    select * from tab12


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quarta-feira, 29 de abril de 2009 19:38
  • Eduardo,

    Veja se este exemplo ajuda:

    ALTER TRIGGER [dbo].[T_Formatar_NumeroRecebimento]
     On [dbo].[CTENTRADA_RECEBIMENTO_LATEX]
     After Insert
    As
     Declare @CodSequencial Int,
                @NumCadastro VarChar(7)
    
    
     Set @CodSequencial=(Select Max(CodSequencial) From Inserted Where Year(DataControle)=Year(GetDate()))
     Set @NumCadastro=(Select NumCadastro From Inserted Where CodSequencial = @CodSequencial And Year(DataControle)=Year(GetDate()))
    
     Update CTEntrada_Recebimento_Latex
      Set Status_Produto=(Select Status_Produto From CTEntrada_Cadastro_Latex
                                     Where NumCadastro=@NumCadastro)
      Where CodSequencial=@CodSequencial
      And    Year(DataControle)=Year(GetDate())
    
     DECLARE @NUMMP CHAR(7)
     SET @NUMMP=(SELECT NUMMP FROM CTENTRADA_PQC_REVALIDACAO 
                           WHERE CODSEQUENCIAL=(SELECT MAX(CODSEQUENCIAL) FROM CTENTRADA_PQC_REVALIDACAO))
     
      INSERT INTO CTENTRADA_PQC_RESULTADOS_REVALIDACAO(NUMMP, NUMREVALIDACAO, CODRELACIONAMENTO, CODSEQUENCIALPRODUTO, CODSEQUENCIALMETODO, AMOSTRA)
        SELECT PQC.NUMMP, 
                   MAX(PQC.NUMREVALIDACAO)+1 AS NUMREVALIDACAO,
                   MAX(PQCx.CODRELACIONAMENTO) AS CODRELACIONAMENTO,
                   PQCx.CODSEQUENCIALPRODUTO,
                   PQCx.CODSEQUENCIALMETODO,
                   ''
        FROM CTENTRADA_PQC_REVALIDACAO PQC INNER JOIN PQCxME PQCx
                                ON PQC.NUMMP = @NUMMP
                           INNER JOIN PRODUTOSQUIMICOS PQ 
                                ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                AND PQC.NUMCADASTRO = PQ.NUMCADASTRO   
                                AND PQCx.CODRELACIONAMENTO = (SELECT MAX(PQCx.CODRELACIONAMENTO) FROM PQCxME PQCx INNER JOIN PRODUTOSQUIMICOS PQ
                                             ON PQCx.CODSEQUENCIALPRODUTO = PQ.CODSEQUENCIALPRODUTO
                                                                                                 WHERE PQ.NUMCADASTRO = PQC.NUMCADASTRO)
           GROUP BY PQC.NUMMP, PQCx.CODSEQUENCIALPRODUTO, PQCx.CODRELACIONAMENTO, PQCx.CODSEQUENCIALMETODO, PQCx.CODSEQUENCIAL
           ORDER BY PQCx.CODSEQUENCIAL
    

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 29 de abril de 2009 19:38
  • Boa Tarde,

    Não acho que esse tipo de trigger baseada em MAX seja uma boa idéia. Embora funcione, basta você adicionar alguns usuários simultâneos e verá o quanto essa solução é frágil. Detalho isso no artigo abaixo:

    Piores práticas - Geração de seqüênciais baseados no MAX 1
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!236.entry

    Se você deseja trabalhar com seqüenciais eu sugiro optar pelo Identity. É possível recuperar o valor inserido com as funções @@Identity e SCOPE_IDENTITY(). Você poderá aprender a utilizá-lo no link abaixo:

    SQL Server: Geração de seqüenciais de forma automática
    http://www.plugmasters.com.br/sys/materias/836/1/SQL-Server%3A-Gera%E7%E3o-de-seq%FCenciais-de-forma-autom%E1tica

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 29 de abril de 2009 20:54
  • Maia,

    Somente como informação, na estrutura das minhas tables, utilizo para geração do meu codigo sequencial o Identity, e com base neste identity eu utilizo o Max!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 30 de abril de 2009 17:59
  • Oi Jr.

    Eu imagino que no seu caso haja boas razões para fazer isso, mas o fato é que o MAX deve ser evitado, pois, em ambientes de muita concorrência ele é problema certo. Claro que há prós e contras, mas no geral devemos evitar utilizá-los. Normalmente esse tipo de solução não escala.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 30 de abril de 2009 18:22