Контроль численности пользователей
Как известно, одновременно в 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 forselect 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 и подходит для обеих баз.
Данный функционал включает в себя настроечные таблицы и кодеюнит, который и делает всю «грязную» работу и может быть запущен как вручную, так и при помощи NAS. Поскольку одна сессия NAS всегда входит в лицензию, то воспользовавшись ею, мы сможем настроить сервис, который и будет отключать пользователей без нашего участия. Помимо этого данный функционал умеет контролировать и количество запущенных сессий под одним логином. А если не много его доработать, то можно получить механизм исключений для избранных пользователей, таких как, например, директор или администратор. Оригинальное описание данного метода и соответствующие объекты можно найти тут.
Метки: Бариев Юрий

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