Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Активные сессии пользователей  [new]
Tketano
Member

Откуда:
Сообщений: 94
Добрый день.

Есть классическое приложение клиент - сервер (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, но здесь нужны права на просмотр всех записей, что не очень хорошо.

Поделитесь, кто реализовывал нечто похожее! Заранее, спасибо :)
15 фев 17, 12:17    [20213488]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8303
Tketano,

прибивайте все ID, которых нет в sys.dm_exec_sessions. Напишите процедуру которая execute as доверенное имя.
15 фев 17, 12:55    [20213681]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
Tketano
Member

Откуда:
Сообщений: 94
Владислав Колосов
Tketano,

прибивайте все ID, которых нет в sys.dm_exec_sessions. Напишите процедуру которая execute as доверенное имя.

Такая и была мысль. Затащить session_id (служебного потока клиента) и host_process_id в таблицу Sessions и проверять их наличие в sys.dm_exec_sessions.

Красивый выход, но при переходе на такую систему, как вы правильно заметили, придется создать отдельную учетку с соответствующими правами. А это значит скрипт обновления должен выполняться от sysadmin (CREATE LOGIN ...), что отличается от текущей политики - db_owner. Будет куча недовольных и консультировать десятки администраторов, что эта такая за учетка с пугающими правами - перебор. А еще есть любители игнорировать ошибки обновления. Лично я так вижу развитие событий :)
15 фев 17, 13:20    [20213842]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
event notifications уровня сервера на audit_logon и audit_logout с очередью в целевой БД.
В процедуре активации очереди актуализировать вашу таблицу.
15 фев 17, 13:30    [20213921]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
Tketano
Member

Откуда:
Сообщений: 94
invm
event notifications уровня сервера на audit_logon и audit_logout с очередью в целевой БД.
В процедуре активации очереди актуализировать вашу таблицу.

Мысль ясна. Как решение задачи наверно более правильное, но, если честно, с очередями/уведомлениями/service broker в ms sql server не работал. Попахивает серьезной переработкой принципов и кода :)) И рискну предположить, что для уведомлений на уровне сервера нужны права, выходящие за рамки db_owner.
15 фев 17, 13:40    [20213979]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Tketano
Попахивает серьезной переработкой принципов и кода :)) И рискну предположить, что для уведомлений на уровне сервера нужны права, выходящие за рамки db_owner.
Вы б почитал что ли о чем речь идет, а потом уже предположения строили :)
Кстати, а наличие разрешения, выходящего за рамки db_owner, для полного доступа к sys.dm_exec_sessions вас не смущает?
15 фев 17, 13:57    [20214069]     Ответить | Цитировать Сообщить модератору
 Re: Активные сессии пользователей  [new]
Tketano
Member

Откуда:
Сообщений: 94
invm
Кстати, а наличие разрешения, выходящего за рамки db_owner, для полного доступа к sys.dm_exec_sessions вас не смущает?

Еще как смущает, об этом я уже написал выше :)
15 фев 17, 14:04    [20214102]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить