none
Trigger - INSERTED RRS feed

  • Pergunta

  • Pessoal,

    gostaria de esclarecer uma dúvida. Se por acaso eu fizer uma trigger que rode depois de um insert. Os dados do meu atual insert estrão na minha tabela Inserted, ok?

    tranquilo, vamo lá.

    mas se por ventura eu faço um insert em 17:31:33 e um outro insert é realizado por outro usuário as 17:31:34 o que eu vou ter na minha tabela Inserted?

    A tabela inserted é por sessão igual a um temporária ou ela é global?

    sexta-feira, 30 de janeiro de 2015 19:32

Respostas

  • Renato,

    O conteúdo da tabela INSERTED normalmente está relacionado às linhas afetadas por uma transação (que pode envolver um comando simples ou um bloco de comandos).

    Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros. Se dois usuários diferentes utilizarem um sistema e efetuarem uma inclusão, com o intervalo de tempo de 2 segundos entre as mesmas, então a trigger seria executada 2 vezes com 1 registro na tabela INSERTED a cada vez.

    No link abaixo vc pode encontrar maiores detalhes:

    https://technet.microsoft.com/en-us/library/aa214435(v=sql.80).aspx

    Espero ter ajudado.

    Abs.

    Renato,

          Os pontos citados pelo Renato Groffe estão corretos, mas tenho uma observação para esclarecer bem o comportamento do SQL. Neste ponto você cita: "Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros." Na verdade, se um único INSERT alterar 2 linhas, a tabela INSERTED terá 2 registros, se forem 2 INSERTS, cada insert irá disparar a trigger 1 vez e a tabela inserted terá 1 registro cada vez que ela rodar mesmo que ela faça parte de uma mesma transação. Essa diferença é sutil, mas importante. Veja o exemplo:

    -- Neste caso, a tabela INSERTED dentro da trigger conterá 2 registros. BEGIN TRAN UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO IN (1,2) -- 2 rows affected COMMIT -- Neste caso, a tabela INSERTED dentro da trigger conterá 1 registro a cada UPDATE executado

    -- Note que os dois updates estão na mesma transação, e ainda assim, o comportamento será como citado acima.

    BEGIN TRAN UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO = 1 -- 1 rows affected UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO = 2 --- 1 rows affected COMMIT



    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    sexta-feira, 30 de janeiro de 2015 20:49
    Moderador
  • Renato,

    O conteúdo da tabela INSERTED normalmente está relacionado às linhas afetadas por uma transação (que pode envolver um comando simples ou um bloco de comandos).

    Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros. Se dois usuários diferentes utilizarem um sistema e efetuarem uma inclusão, com o intervalo de tempo de 2 segundos entre as mesmas, então a trigger seria executada 2 vezes com 1 registro na tabela INSERTED a cada vez.

    No link abaixo vc pode encontrar maiores detalhes:

    https://technet.microsoft.com/en-us/library/aa214435(v=sql.80).aspx

    Espero ter ajudado.

    Abs.

    sexta-feira, 30 de janeiro de 2015 19:56
  • Deleted
    sábado, 31 de janeiro de 2015 19:39

Todas as Respostas

  • Renato,

    O conteúdo da tabela INSERTED normalmente está relacionado às linhas afetadas por uma transação (que pode envolver um comando simples ou um bloco de comandos).

    Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros. Se dois usuários diferentes utilizarem um sistema e efetuarem uma inclusão, com o intervalo de tempo de 2 segundos entre as mesmas, então a trigger seria executada 2 vezes com 1 registro na tabela INSERTED a cada vez.

    No link abaixo vc pode encontrar maiores detalhes:

    https://technet.microsoft.com/en-us/library/aa214435(v=sql.80).aspx

    Espero ter ajudado.

    Abs.

    sexta-feira, 30 de janeiro de 2015 19:56
  • Renato,

    O conteúdo da tabela INSERTED normalmente está relacionado às linhas afetadas por uma transação (que pode envolver um comando simples ou um bloco de comandos).

    Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros. Se dois usuários diferentes utilizarem um sistema e efetuarem uma inclusão, com o intervalo de tempo de 2 segundos entre as mesmas, então a trigger seria executada 2 vezes com 1 registro na tabela INSERTED a cada vez.

    No link abaixo vc pode encontrar maiores detalhes:

    https://technet.microsoft.com/en-us/library/aa214435(v=sql.80).aspx

    Espero ter ajudado.

    Abs.

    Renato,

          Os pontos citados pelo Renato Groffe estão corretos, mas tenho uma observação para esclarecer bem o comportamento do SQL. Neste ponto você cita: "Caso os INSERTs que vc comentou façam parte da mesma transação, a tabela INSERTED teria em teoria 2 registros." Na verdade, se um único INSERT alterar 2 linhas, a tabela INSERTED terá 2 registros, se forem 2 INSERTS, cada insert irá disparar a trigger 1 vez e a tabela inserted terá 1 registro cada vez que ela rodar mesmo que ela faça parte de uma mesma transação. Essa diferença é sutil, mas importante. Veja o exemplo:

    -- Neste caso, a tabela INSERTED dentro da trigger conterá 2 registros. BEGIN TRAN UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO IN (1,2) -- 2 rows affected COMMIT -- Neste caso, a tabela INSERTED dentro da trigger conterá 1 registro a cada UPDATE executado

    -- Note que os dois updates estão na mesma transação, e ainda assim, o comportamento será como citado acima.

    BEGIN TRAN UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO = 1 -- 1 rows affected UPDATE TABELA SET CAMPO1 = 1 WHERE CODIGO = 2 --- 1 rows affected COMMIT



    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    sexta-feira, 30 de janeiro de 2015 20:49
    Moderador
  • Renato,

         Note que um INSERT executado um segundo após (ou mesmo um milésimo de segundo) o outro serão duas transações diferentes ea tabela INSERTED conterá os registros referentes a sua transação independentemente da outra.

        Isso já responde também a sua segunda pergunta, se a tabela INSERTED é por sessão ou global... Na verdade ela é por TRANSAÇÃO. Acabada aquela transação, a tabela INSERTED some. Tanto é assim, que ela só existe dentro de triggers. Fora de uma trigger essas tabelas não existem, e não podem ser acessadas.

        Desta forma, respondendo especificamente sua pergunta, se um insert for feito as 17:31:33 a tabela inserted terá 1 registro, que é uma "cópia" dos valores inseridos no comando INSERT, e um insert feito as 17:31:34, conterá 1 registro, a "cópia" dos valores inseridos neste segundo INSERT.


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008


    sexta-feira, 30 de janeiro de 2015 20:55
    Moderador
  • Deleted
    sábado, 31 de janeiro de 2015 09:49
  • Deleted
    sábado, 31 de janeiro de 2015 19:39