none
Trigger com problema de execução RRS feed

  • Pergunta

  • Olá Pessoal,

    Estou com um problema nessa trigger,

    CREATE TRIGGER Insert
    ON dbo.001
    after insert
    AS
    begin
    INSERT INTO dbo.002 (ait,numero,placa,tipo)
    select numero,fotograma,placa,'A'
    from inserted
    where numero like 'N%'
    and fotograma not in(select numero from dbo.002)
    end

    Tenho 2 duas instâncias,

    1- Produção

    2- Desenvolvimento,

    Executei a trigger no de desenvolvimento, e funcionou beleza, tudo certinho.

    Agora quando eu executo no ambiente de produção, o SQL Server fica executando e não me retorna nada, é como se a tabela estivesse bloqueada, ou algo do tipo, ou seja, o SQL Server fica executando ... e não termina a criação da trigger. A primeira coisa que pensei foi se a tabela está bloqueada, mas nao estava pois executei select top 10 * from tabela, e me retonou os registros.

    Resumindo: esse comando funciona beleza na instância de dev, mas de produção não, será que pode ser os programas que estão alimentando os bancos, o que poderia ser?

    Quantidade de linhas na tabela 001: 3670131
    Quantidade de linhas na tabela 002: 3662983   


    Muito Obrigado.

     


    • Movido Gustavo Maia Aguiar quinta-feira, 1 de setembro de 2011 17:54 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 1 de setembro de 2011 17:17

Respostas

  • Just,

     

    O fato de voce conseguir dar o select nao quer dizer que a tabela não esteja bloqueada, veja assim:

    Se um usuario A estiver atualizando milhoes de linhas da tabelas, depenendo no nivel de isolamento do usuario B, o mesmo conseguira sim realizar o select, se falamos de SQL Server (Como é o caso, ja que o Oracle por exemplo naqo possui essa opção), podemos até deixar em read uncommited, aonde o mesmo não entrara em lock e realizada os dados mesmo antes da finalização da transação do usuario A.

     

    Se não em engano, a criação de uma trigger depende que a tabela seja lockada de modo exclusivo, o que quer dizer que o nivel de isolamento nao importa, simplismente nao pode ter ninguam a utilizando e ponto, para verificar realmente lock em sua base, rode em outra conexão (A mesma que voce rodou o select), a query:

    SELECT * FROM SYS.SYSPROCESSES WHERE BLOCKED <> 0


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:29
    Moderador
  • Just,

     

    Quando voce rodou a query que eu te passei, a query de criação da trigger estava em execução? Se sim, ela nao esta em lock de objeto e seu problema deve estar em outra coisa...


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:40
    Moderador
  • Just..

     

    Rs...ai voce complica, nao consigo ler nada assim, mas vou tentar explicar o que voce deve ver:

    A primeira coluna que voce obteve como retorno se chama SPID, com, essa coluna informa qual é o SPID que esta bloqueado que no seu caso deve ser o mesmo da conexão que voce esta criando a procedure.

    Ja a terceira coluna chama Blocked, aqui voce tem o SPID da query que esta bloqueando, ou seja, pegue o resultado de blocked, e veja o que esse cara esta fazendo, se for algo nao muito importante por exemplo, (Voce disse que é ambiente de homologacao), simplismente de um KIll nesse cara (Espero o rollback se necessario), que sua triggers sera criada.


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:46
    Moderador
  • Sem problemas Just! =D...

     

    Só marque como "resposta" as respostas que te ajudaram a chegar na solução para que possa ajudar outros usuarios que venham a ter a mesma duvida....


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:52
    Moderador
  • Just,

     

    Mesmo em meus ambientes de produção eu utilizo uma procedure bem famosa chamada sp_whoisactive

    o download dela pode ser feito aqui: http://sqlblog.com/files/default.aspx Baixe a ultima versão.


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 18:03
    quinta-feira, 1 de setembro de 2011 17:58
    Moderador

Todas as Respostas

  • Just,

     

    O fato de voce conseguir dar o select nao quer dizer que a tabela não esteja bloqueada, veja assim:

    Se um usuario A estiver atualizando milhoes de linhas da tabelas, depenendo no nivel de isolamento do usuario B, o mesmo conseguira sim realizar o select, se falamos de SQL Server (Como é o caso, ja que o Oracle por exemplo naqo possui essa opção), podemos até deixar em read uncommited, aonde o mesmo não entrara em lock e realizada os dados mesmo antes da finalização da transação do usuario A.

     

    Se não em engano, a criação de uma trigger depende que a tabela seja lockada de modo exclusivo, o que quer dizer que o nivel de isolamento nao importa, simplismente nao pode ter ninguam a utilizando e ponto, para verificar realmente lock em sua base, rode em outra conexão (A mesma que voce rodou o select), a query:

    SELECT * FROM SYS.SYSPROCESSES WHERE BLOCKED <> 0


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:29
    Moderador
  • Olá Fabrizzio,

    Obrigado pelas informações, mas a consulta não me retornou nada...

    quinta-feira, 1 de setembro de 2011 17:39
  • Just,

     

    Quando voce rodou a query que eu te passei, a query de criação da trigger estava em execução? Se sim, ela nao esta em lock de objeto e seu problema deve estar em outra coisa...


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:40
    Moderador
  • Ah tah, enquanto ela tava em execução me deu isso:


    109    23988  116     0x0002   10250                LCK_M_SCH_M                      TAB: 14:626101271:0                                                                                                                                                                                                                                              14     1      281         103                  2           2011-09-01 14:27:23.500 2011-09-01 14:42:34.567 0      2         suspended                      0x0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 SRV001FA                                                                                                                       Microsoft SQL Server Management Studio - Query                                                                                   23708       CREATE TRIGGER                                                                                                                                                                                                                                                                     DEEF9904E3F5 LPC          sa                                                                                                                               0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0x01000E00E1E19435F0C372D60000000000000000 0           0           0

    (1 row(s) affected)



    E outra, ao tentar matar um SPID, sempre me dar outro...
    quinta-feira, 1 de setembro de 2011 17:44
  • Just..

     

    Rs...ai voce complica, nao consigo ler nada assim, mas vou tentar explicar o que voce deve ver:

    A primeira coluna que voce obteve como retorno se chama SPID, com, essa coluna informa qual é o SPID que esta bloqueado que no seu caso deve ser o mesmo da conexão que voce esta criando a procedure.

    Ja a terceira coluna chama Blocked, aqui voce tem o SPID da query que esta bloqueando, ou seja, pegue o resultado de blocked, e veja o que esse cara esta fazendo, se for algo nao muito importante por exemplo, (Voce disse que é ambiente de homologacao), simplismente de um KIll nesse cara (Espero o rollback se necessario), que sua triggers sera criada.


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:46
    Moderador
  • Fabrizzio,

    Deu certo, mt obrigado!!!

    quinta-feira, 1 de setembro de 2011 17:50
  • Sem problemas Just! =D...

     

    Só marque como "resposta" as respostas que te ajudaram a chegar na solução para que possa ajudar outros usuarios que venham a ter a mesma duvida....


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 17:52
    quinta-feira, 1 de setembro de 2011 17:52
    Moderador
  • Fabrizzio,

    Só mais uma pergunta, tem como eu ver o que o SPID 156 ( que estava bloqueando ) está fazendo?

    quinta-feira, 1 de setembro de 2011 17:53
  • Just,

     

    Mesmo em meus ambientes de produção eu utilizo uma procedure bem famosa chamada sp_whoisactive

    o download dela pode ser feito aqui: http://sqlblog.com/files/default.aspx Baixe a ultima versão.


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta JustSQL quinta-feira, 1 de setembro de 2011 18:03
    quinta-feira, 1 de setembro de 2011 17:58
    Moderador