none
Como saber se a tabela está em "Executing query..." RRS feed

  • Pergunta

  • Pessoal, criei um procedimento que logo no início DROPO uma tabela.

    Antes de DROPÁ-LA preciso saber se ela está para ser listada em algum select (se na telinha de alguém tiver a mensagem "Executing query..." não poderei DROPÁ-LA).

    Há uns tempos, postei uma pergunta parecida, e um participante do site sugeriu consultar a sp_who2, mas no retorno dessa proc não constam informações sobre o status da tabela.

     

     

     

     


    []´s Obrigado, Denison Soares
    terça-feira, 16 de agosto de 2011 14:14

Respostas

  • Denilson,

     

    Desculpa a demora, que eu gosto sempre de falar coisas consistentes para quem ajudo, então estava testando algumas possibilidades, e descobri uma boa para voce.

    Veja, primeiro eu criei a tabela id:

    create table id(id int identity(1,1), nome varchar(100))

     

    Depois fiz uma carga de dados, no caso fiz de 10 em 10 inserindo 10.000 vezes com quase todas as letras do alfabeto na posicao 1 (Para poder gerar uma consulta lenta e simular seu ambiente), fiz o insert varias vezes, no total fiquei com 400.000 linhas na tabela id

    insert into id (nome)

    values

    ('karlos'),

    ('leandro'),

    ('mauro'),

    ('naitor'),

    ('olavo'),

    ('paula'),

    ('queijo'),

    ('rayssa'),

    ('sandra'),

    ('zoraide')

    go 10000

     

    Então, iniciei o select em uma transação:

    begin tran

    select id, nome from id order by nome, id desc

     

    Em uma janela de query paralela, enquanto os 20 segundos do select estavam rodando, ou seja, o select estava em andamento e ainda nao havia terminado, eu executei essa query:

    begin tran

    set lock_timeout 0

    begin try

    drop table id

    end try

    begin catch

    print ('Erro, tabela em uso')

    end catch

    commit

     

    E tive como retorno: Erro, tabela em uso.

     

    O por que disso: Veja que a primeira linha da minha transação de drop table eu estou colocando o lock_timeout em 0, ou seja, assim que ela entrar em lock ja daria erro, como eu coloquei um TRY/CATCH, ele simplismente me exibe que a tabela esta em uso, não é gerado erro e a tabela não é dropada nem espera o lock, no caso, mesmo depois do termino do select, minha tabela continuou la.


    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
    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 16 de agosto de 2011 17:32
    • Marcado como Resposta Denison Soares terça-feira, 16 de agosto de 2011 21:21
    • Não Marcado como Resposta Denison Soares terça-feira, 16 de agosto de 2011 21:22
    • Não Sugerido como Resposta Denison Soares quarta-feira, 17 de agosto de 2011 15:57
    • Marcado como Resposta Denison Soares quarta-feira, 17 de agosto de 2011 16:02
    terça-feira, 16 de agosto de 2011 15:14
    Moderador

Todas as Respostas

  • Denilson,

     

    Qual informação exatamente que voce precisa? O drop de uma tabela é bem rapido, e não creio nem que voce conseguira ver esse executing query.... a não ser que algum usuario esteja utilizando a tabela claro....


    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
    terça-feira, 16 de agosto de 2011 14:17
    Moderador
  •  

    Fabrizzio, é o seguinte...

    Atualmente se eu executar o comando DROP TABLE AUX, e a tabela AUX estiver sendo usada (aguardando retorno dos dados - SELECT * FROM AUX), o comando DROP será executado após a finalização do SELECT.

    O que eu preciso é que se ao executar o DROP e a tabela estiver em uso (aguardando retorno dos dados), o DROP seja abortado.



    []´s Obrigado, Denison Soares
    terça-feira, 16 de agosto de 2011 14:41
  • Bom Dia,

    Se você for executar o DROP TABLE e a tabela estiver em uso, o comando ficará bloqueado até que a tabela fique novamente disponível. Você pode usar o comando SET LOCK_TIMEOUT para dizer que o tempo máximo suportado por um LOCK é X segundos. Colocando o tempo para 1 segundo, por exemplo, se o DROP TABLE não conseguir executar em um segundo, o comando será abortado (e um erro será gerado).

    Lembre-se de que será necessário tratar o erro retornado (um TRY CATCH só para o DROP TABLE seria bem vindo). Lembre-se também que o SET LOCK_TIMEOUT irá valer para a SP inteira. Caso seja necessário, você pode tornar essa propriedade nula, utilizando-a com o valor igual a zero (que é o valor padrão, ou seja, por padrão, espera-se indefinidamente).

    Agora particularmente falando acredito que haja alguma falha grave de arquitetura. Não é nada comum que uma SP drope e crie tabelas que possam vir a ser usadas por outros usuários. Não é nada comum alguém querer dropar uma tabela dentro de uma SP que possa estar em uso por outro usuário. Se você conseguir dropar por exemplo, o outro usuário simplesmente irá procurar por um objeto que não existe e terá uma mensagem de erro.

    Lembre-se também que todas essas atividades compõe o log de transações. Qual o sentido de ficar populando uma tabela, excluíndo-a, recriando-a e populando-a ? Seria mais inteligente verificar se a tabela tem ou não dados ou até eventualmente utilizar uma tabela temporária se aplicável. Essas alternativas não envolveriam toda essa "ginástica".

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 16 de agosto de 2011 15:13
  • Denilson,

     

    Desculpa a demora, que eu gosto sempre de falar coisas consistentes para quem ajudo, então estava testando algumas possibilidades, e descobri uma boa para voce.

    Veja, primeiro eu criei a tabela id:

    create table id(id int identity(1,1), nome varchar(100))

     

    Depois fiz uma carga de dados, no caso fiz de 10 em 10 inserindo 10.000 vezes com quase todas as letras do alfabeto na posicao 1 (Para poder gerar uma consulta lenta e simular seu ambiente), fiz o insert varias vezes, no total fiquei com 400.000 linhas na tabela id

    insert into id (nome)

    values

    ('karlos'),

    ('leandro'),

    ('mauro'),

    ('naitor'),

    ('olavo'),

    ('paula'),

    ('queijo'),

    ('rayssa'),

    ('sandra'),

    ('zoraide')

    go 10000

     

    Então, iniciei o select em uma transação:

    begin tran

    select id, nome from id order by nome, id desc

     

    Em uma janela de query paralela, enquanto os 20 segundos do select estavam rodando, ou seja, o select estava em andamento e ainda nao havia terminado, eu executei essa query:

    begin tran

    set lock_timeout 0

    begin try

    drop table id

    end try

    begin catch

    print ('Erro, tabela em uso')

    end catch

    commit

     

    E tive como retorno: Erro, tabela em uso.

     

    O por que disso: Veja que a primeira linha da minha transação de drop table eu estou colocando o lock_timeout em 0, ou seja, assim que ela entrar em lock ja daria erro, como eu coloquei um TRY/CATCH, ele simplismente me exibe que a tabela esta em uso, não é gerado erro e a tabela não é dropada nem espera o lock, no caso, mesmo depois do termino do select, minha tabela continuou la.


    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
    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 16 de agosto de 2011 17:32
    • Marcado como Resposta Denison Soares terça-feira, 16 de agosto de 2011 21:21
    • Não Marcado como Resposta Denison Soares terça-feira, 16 de agosto de 2011 21:22
    • Não Sugerido como Resposta Denison Soares quarta-feira, 17 de agosto de 2011 15:57
    • Marcado como Resposta Denison Soares quarta-feira, 17 de agosto de 2011 16:02
    terça-feira, 16 de agosto de 2011 15:14
    Moderador
  • Ahh Muito Bacana Fabrizzio!! Deu Certo !!! Obrigado !!!

    Agradeço também a resposta do Júnior, alterei a estrutura de minha procedure !!

     

    Valeu !!

     

    []´s

    Denison Soares


    []´s Obrigado, Denison Soares
    quarta-feira, 17 de agosto de 2011 15:57
  • Denilson,

     

    Para ajudar oturos usuario que venham a ter a mesma duvida, marque como "resposta" as respostas que te ajudaram...


    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
    quarta-feira, 17 de agosto de 2011 15:59
    Moderador