none
Timeout RRS feed

  • Pergunta

  • Pessoal boa tarde

    Tenho uma pergunta é possível criar uma stored procedure onde em tempos em tempos a mesma é executada e caso encontre uma sessão inativa por exemplo 20 minutos à mesma seja desconectada?

    Estou tentando implementar algo no banco de dados onde quando à sessão aberta pelo meu aplicativo estiver inativa o SQL Server desconecta essa sessão sei que em outros bancos consigo fazer isso mas como implemento isso no sql server?

    segunda-feira, 5 de agosto de 2013 19:49

Todas as Respostas

  • Eder, voce pode colocar a sua procedure para verificar a tabela sys.sysprocesses onde ficam todos os processos da base de dados, verificando os SPIDs acima de 50 (abaixo disto é do proprio SQL Server), nesta tabela vai ter a coluna last_batch que é o momento que foi executada a ultima coisa desta conexão.


    Alexandre Matayosi Conde Mauricio.

    segunda-feira, 5 de agosto de 2013 19:55
  • Olhando os fóruns eu encontrei a seguinte procedure que por sinal funciona muito bem:

    create procedure [dbo].[TIMEOUT] (@TEMPO INTEGER)
    as
    DECLARE @kill_id smallint 
    begin
      DECLARE spid_cursor CURSOR FOR
      select spid -- loginame 
        from master.dbo.sysprocesses 
       where dbid > 4 
         and last_batch < dateadd(minute, @TEMPO, getdate())
         and dbid > 5
    	 and loginame <> 'abcd' -- caso seja necessário não derrubar o usuário abcd
       --and last_batch < dateadd(hour, -1, getdate()) 
       
       OPEN spid_cursor
       FETCH NEXT 
       FROM spid_cursor 
       INTO @kill_id
       WHILE (@@FETCH_STATUS = 0)
       BEGIN
          EXECUTE ('KILL ' + @kill_id) 
          FETCH NEXT 
          FROM spid_cursor 
          INTO @kill_id
       end
       
       CLOSE spid_cursor
       DEALLOCATE spid_cursor 
       
      return 1 
    
    end
    
    GO
    

    Porém estou com um problema eu preciso implementar o timeout e um determinado grupo de usuários da minha aplicação não podem ser desconectados porém na tabela master.dbo.sysprocesses não possui a informação do usuário do meu sistema e pensei em criar uma tabela auxiliar onde me permita registrar o usuário e à sessão do mesmo porém existe uma forma deu capturar a sessão do usuário quando loga, pois todas as conexões são estabelecidas com o usuário sa do sql server porem meu sistema tem uma tabela de usuários será que tem uma forma de associar essa tabela com à sessão?

    terça-feira, 6 de agosto de 2013 11:57
  • Na tabela do sys.sysprocesses que tambem é usada nesta query que voce passou tem a coluna "loginame" que é o usuario que esta executando o processo, voce pode salvar uma tabela as exceções e colocar um filtro para não dar um kill quando for destes usuarios...

    Alexandre Matayosi Conde Mauricio.

    terça-feira, 6 de agosto de 2013 16:04
  • Eder não utiliza essa proc que vc encontrou pois ela ficará em um processo infinito.

    1º o controle da sessão deve ser feito direto no código c# isso pode ser aplicado no arquivo web.config.

    O que poderia ser feito é o seguinte pode ser utilizado quando esta session expirar chamar alguma rotina para que altere o valor da flag de logado para deslogado ou acesse a proc que faz o tratamento desejado, existe uma função no arquivo .asax, algo parecido com o código abaixo.

    void Session_End(object sender, EventArgs e)
    {
        Response.Redirect("~/Timeout.aspx");
    }  

    Mas isso vai depender de qual framework esta utilizando porém é possível tanto para webforms quanto para mvc.

    Obs. Dessa maneira vc não mexe no banco de dados! mas se quiser mesmo fazer uma ação de tempos em tempos vc deve da uma pesquisada sobre Job no banco de dados e configurar um schedule para o mesmo.

    Boa sote.

    terça-feira, 6 de agosto de 2013 16:22
  • Legal eu estou tentando realizar um misto estou executando uma procedure já diferente dessa e tratando o retorno na aplicação estou realizando ainda alguns testes assim que terminar eu posto o resultado e obrigado a todos pela ajuda.
    terça-feira, 6 de agosto de 2013 20:54