Добрый день.
Есть классическое приложение клиент - сервер (MS SQL 2005), коробочное решение, доменная авторизация. Для части функционала необходимо отслеживать активные сессии пользователей и копии запущенных приложений. Реализовано это следующим образом.
Механизм работает как часы. Однако столкнулись с тем, что на некоторых серверах происходят "скачки" времени. Почему происходят - неизвестно, администраторы в фирмах ленивые жопы и не хотят читать журналы Windows. В основном проблемы с 2008 сервером.
Естественно, при скачках "вперед" на минуту код
Как обойти это проблему, кроме как увеличить допустимый интервал для LastRequest, придумать не могу. Это не кажется идеальным решением. Была хорошая мысль перейти на отслеживание сеансов через sys.dm_exec_sessions/sys.sysprocesses, но здесь нужны права на просмотр всех записей, что не очень хорошо.
Поделитесь, кто реализовывал нечто похожее! Заранее, спасибо :)
Есть классическое приложение клиент - сервер (MS SQL 2005), коробочное решение, доменная авторизация. Для части функционала необходимо отслеживать активные сессии пользователей и копии запущенных приложений. Реализовано это следующим образом.
CREATE TABLE [Sessions] ( SessionId [int] identity(1,1), UserName [sysname] NOT NULL CONSTRAINT [DF_Sessions_UserName] DEFAULT SUSER_NAME(), AppName [sysname] NOT NULL CONSTRAINT [DF_Sessions_AppName] DEFAULT APP_NAME(), LastRequest [datetime] NOT NULL CONSTRAINT [DF_Sessions_LastRequest] DEFAULT GETDATE(), -- ... -- прочее несущественно )В процедуре логина добавляем запись в Sessions, в процедуре логаута - удаляем. LastRequest - время последнего служебного запроса с клиента (фоновый поток, поле по SessionId обновляется раз в ~10 секунд). Проблема возникает, когда клиент завершает работу некорректно (без вызова логаута) и в таблице остается мусор. Чтобы его удалить при работе с таблицей происходит зачистка "мертвых сессий":
delete Sessions where DATEADD(second, 60, LastRequest) < getdate()
Механизм работает как часы. Однако столкнулись с тем, что на некоторых серверах происходят "скачки" времени. Почему происходят - неизвестно, администраторы в фирмах ленивые жопы и не хотят читать журналы Windows. В основном проблемы с 2008 сервером.
Естественно, при скачках "вперед" на минуту код
delete Sessions where DATEADD((second, 60, LastRequest) < getdate()убивает все сессии пользователей.
Как обойти это проблему, кроме как увеличить допустимый интервал для LastRequest, придумать не могу. Это не кажется идеальным решением. Была хорошая мысль перейти на отслеживание сеансов через sys.dm_exec_sessions/sys.sysprocesses, но здесь нужны права на просмотр всех записей, что не очень хорошо.
Поделитесь, кто реализовывал нечто похожее! Заранее, спасибо :)