Inquiridor
Timeout

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?
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.
-
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?
-
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.
-
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.
-