Контроль численности пользователей

Как известно, одновременно в Navision может работать ограниченное число пользователей. Максимальное количество таких пользователей ограничивается пользовательской лицензией. Конечно, это ограничение может быть пересмотрено в любой момент путем покупки не хватающего количества. Но так же известно, что каждая дополнительная сессия стоит денег. Поэтому, большинство компаний, в которых установлен Navision, рано или поздно задумываются над проблемой контроля количества одновременных пользователей системы.

Что может быть причиной нехватки пользовательских сессий и на чем можно сэкономить? Зачастую пользователь, открыв систему и поработав в ней некоторое время, сворачивает окно программы не закрывая его. Тем самым пользователь занимает сессию, но не работает в системе. Также пользователь может запустить приложение одновременно несколько раз, и тем самым занять сразу несколько сессий. И если с занятием нескольких сессий можно бороться административными мерами, то с простоем бороться практически бессмысленно.

При всей очевидности проблемы разработчики не предусмотрели никакой возможности подобного контроля. И если все сессии заняты, то войти в систему не сможет даже ее администратор, как ни парадоксально это звучит. Отключить сессию пользователя базы Native не возможно штатными средствами. Для базы SQL данная возможность присутствует, как штатная возможность MS SQL Server. Однако способ отключения пользователей вручную тоже является далеко не оптимальным. Логическим продолжением всего выше сказанного является функционал, который бы отключал «спящих» пользователей автоматически.

За время работы с Navision повстречал несколько решений данной проблемы. Два наиболее достойных, по моему мнению, приведу ниже. Надеюсь, они вам помогут.

1. Способ отключения спящих пользователей для SQL:

CREATE PROCEDURE sp_Clear_NAV (@db_Name varchar(100),@prog_name varchar(100), @timer_min int ) ASSET NOCOUNT ON 
 
-- Сергеев П.Н. 12/08/04 
 
-- процедура выкидывает из БД с именем @db_Name и приложения @prog_name пользователей, 
 
-- не работающих более @timer_min 
 
-- @db_Name - имя БД 
 
-- @prog_name - имя приложения или часть имени 
 
-- @timer_min - 'простой' приложения в минутах, по истечении которого приложение закрывается 
 
declare @spid int 
 
declare @program_name varchar(100) 
 
declare @status varchar(50) 
 
declare @last_batch datetime 
 
declare @host_name varchar(100) 
 
declare @sql varchar(100) 
 
DECLARE @msg varchar(100) 
 
DECLARE @cmd sysname, @var sysname 
 
declare cur_Processes cursor for

select master..sysprocesses.spid, master..sysprocesses.program_name, master..sysprocesses.status,

master..sysprocesses.last_batch, master..sysprocesses.hostname

from master..sysprocesses

inner join master..sysdatabases d on master..sysprocesses.dbid = d.dbid

where d.Name=@db_Name and master..sysprocesses.status=’sleeping’

and charindex(@prog_name,ltrim(master..sysprocesses.program_name) ) > 0

and datediff(n,master..sysprocesses.last_batch, getdate()) > @timer_min

open cur_Processes 

fetch next from cur_Processes into @spid, @program_name,@status, @last_batch, @host_name 

while @@fetch_status=0 

begin 

set @sql='kill '+convert(varchar(100), @spid) 

-- Приложение navision закрыто, так как Вы не работали более NN минут! 

SET @var = @host_name 

SET @cmd = 'net send ' + rtrim(convert(varchar(15),@host_name)) + ' Приложение ' + rtrim( convert(varchar(50),@prog_name)) 

+ ' закрыто, так как Вы не работали более ' + rtrim(convert(varchar(10),@timer_min)) + ' мин!' 

EXEC master..xp_cmdshell @cmdexec(@sql) 

--print @spid 

fetch next from cur_Processes into @spid, @program_name,@status, @last_batch, @host_name 

end 

close cur_Processes 

deallocate cur_Processes"

2. Способ отключения спящих пользователей для Native и SQL при помощи Navision Application Server.

По сравнению с предыдущим имеет плюсы: он использует стандартные возможности Navision и подходит для обеих баз.

 Kill Idle NAV Session

Данный функционал включает в себя настроечные таблицы и кодеюнит, который и делает всю «грязную» работу и может быть запущен как вручную, так и при помощи NAS. Поскольку одна сессия NAS всегда входит в лицензию, то воспользовавшись ею, мы сможем настроить сервис, который и будет отключать пользователей без нашего участия. Помимо этого данный функционал умеет контролировать и количество запущенных сессий под одним логином. А если не много его доработать, то можно получить механизм исключений для избранных пользователей, таких как, например, директор или администратор. Оригинальное описание данного метода и соответствующие объекты можно найти тут.

Метки:



Комментариев: 1

  1. apanko пишет:

    Полезно про несколько открытий НАВа
    http://dynamicsuser.net/blogs/stryk/archive/2008/12/10/prevent-multiple-logins-in-nav-with-sql-server.aspx

Оставьте свой отзыв!