| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			какой AOS UserId соответствует определенному SID в Oracle
			 
			
			Все процессы Ах со стороны Oracle выглядят как процессы юзера "Axapta". 
		
		
		
		
		
		
		
	Можно ли вычислить какой AOS UserId соответствует какому SID в Oracle? Зверушка Ах должна гдето эту информацию хранить. Может кто ковырял в этом направлении? Мечта отлавливать UserId "активистов", нагибающих Oracle (всего у нас под 100 человек постоянно онлайн). Д.К.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Есть формочка 
		
		
		
		
		
		
		
	Администрирование\Пользователи\"Активные пользователи" Для каждого userId выводится SPID... Для M$ это соответствует SPID на SQL-сервере Может и для Oracle прокатит.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Цитата <Для каждого userId выводится SPID... Для M$ это соответствует SPID на SQL-сервере 
		
		
		
		
		
		
		
	Может и для Oracle прокатит. > В Оракле это к сожалению не катит Для меня этот вопрос так и остался актуальный. Может кто-то его уже решил? Что надо поправить в форме "Активные пользователи" чтоб увидеть SID оракла?  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Говорят, ребята из CITP эту траблу решили. И сделали в виде утилиты. Но она сильно платная  
		
		
		
		
		
		
		
	![]() Нам пока решить эту траблу не удалось... Есть идеи у кого-нибудь? С Уважением, Георгий.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			в оракле AUDSID из v$session соответсвует SPID из аксапты "Активные пользователи" 
		
		
		
			с правами DBA запросом типа select SESS.AUDSID, SESS.SID, IO.PHYSICAL_READS from v$session SESS, V$SESS_IO IO where IO.SID = SESS.SID order by IO.PHYSICAL_READS DESC; можно получить: кто из пользователей аксапты больше всех выполнял физическое чтение. Программеры помогли получить такую форму см. attach К сожалению это более менее работает только в трех звенной системе. При толстом подключении , в аксапте можно увидеть только свой SPID   Надо еще что-то думать.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (5). | |
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			в трехзвенке все довольно просто, вот например код кот по спиду вызывает хранимую процедуру  
		
		
		
		
		
		
			X++: server static void ORACLEKillSession(str _spid) { UserConnection connection = new UserConnection(); Statement sqlStatement; ResultSet resultSet; str sqlString; str userid = curuserid(); str sid, serial ; if (_spid == '') return; [serial, sid] = SysUsersOnline::getSerialNoBySPID(_spid); sqlString = 'call AXAPTA_KillSession(' + sid + ', ' + serial + ')'; sqlStatement = connection.createStatement(); sqlStatement.executeUpdate(sqlString); } 
				__________________ 
		
		
		
		
	aLL woRk aNd nO JoY MAKes jAck a dULL Boy  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 X++: server static container getSerialNoBySPID(str _spid) { Statement stmt; ResultSet res; boolean sysTraceActive = xSession::getSysTraceActive(); str query; Connection con = new Connection(); SqlSystem sqlSystem = new SqlSystem(); str retSerialNo, retSID; ; try { if(!_spid) return ['', '']; if (sqlSystem.databaseId()==databaseId::ORACLE) { stmt = con.createStatement(); _spid = strreplace(strreplace(_spid,' ',''),',','\',\''); // res = stmt.executeQuery('SELECT SERIAL#,SID FROM V$SESSION WHERE AUDSID IN (\''+_spid+'\')'); res = stmt.executeQuery(strfmt("SELECT SERIAL#,SID FROM V$SESSION WHERE AUDSID IN ('%1')", _spid)); while (res.next()) { if (! retSerialNo) { retSerialNo = res.getString(1); } else { retSerialNo = retSerialNo + ',' + res.getString(1); } if (! retSID) { retSID = res.getString(2); } else { retSID = retSID + ',' + res.getString(2); } } } return [retSerialNo, retSID]; } catch (Exception::Error) { return [retSerialNo, retSID]; } } 
				__________________ 
		
		
		
		
	aLL woRk aNd nO JoY MAKes jAck a dULL Boy  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Up
			 
			
			Приподниму вопросик. А можно ли непосредственно в оракле получить userId по сессии. Т.е. вроде того "мы берем вьюху v$session, джойним к ней таблицу/вьюху Х и получаем userId для конкретной сессии "
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Afaik непосредственно в Оракле без допиливания Аксапты (причем, видимо, на уровне ядра) - нельзя.Для этого нужно, чтобы информация о сессиях и соотв. пользователях отражалась в БД, а она сейчас вроде есть лишь в памяти АОСа в виде соотв.объектов/структур данных. Более того, как уже отмечалось, в общем случае в Аксапте нельзя идентифицировать пользователя (точнее, сессию) по SPID'у. Это связано с тем, что АОС держит у себя несколько подключений к БД, которые используются при необходимости той или иной сессией аналогично рабочим потокам в СУБД, обрабатывающим пользовательские запросы. В зависимости от нагрузки АОС может прибивать неактивные подключения к БД либо создавать новые - и все это при постоянно висящих пользовательских сессиях. Соотв., со стороны СУБД видны лишь данные, соответствующие подключениям к БД, поэтому идентифицировать по ним конкретную сессию на АОСе и, соотв., пользователя, в общем случае нельзя. Это было бы возможно, если бы АОС постоянно поддерживал в актуальном состоянии некую табличку в БД, где сопоставлял бы номер сессии (или код пользователя) и используемые ей в данный момент SPID'ы и обновлял бы эту табличку каждый раз, когда перечень SPID'ов, используемых той или иной сессией, изменяется.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: greench (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Где-то так я себе это и представлял. Спасибо за ответ.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 NavAx 
		
			
	 | 
	
	
	
		
		
		
		 
			
			С интересом слежу за обсуждением, решил вставить свои 5 копеек. 
		
		
		
		
		
		
			Я в качестве временной меры создал такую табличку (SessionId->SPID) )и веду её пока пакетниками, работающими на каждом сервере. Подпатчил формы активных пользователей и блокировок, дабы они её пользовались. Внешняя софтина, по очереди подключающаяся через COM ко всем AOS и обновляющая таблицу - в процессе разработки, всё руки не доходят. Для отслеживания блокировок пока вполне хватает обновления раз в минуту. ![]() P.S. Я на SQL Server живу, если интересно. 
				__________________ 
		
		
		
		
	Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...  
			 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Мне просто нужны были аргументы, что делать такие вещи со стороны оракла не корректно. Гораздо проще и разумнее сделать запрос из аксапты.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 |