|  28.05.2002, 00:03 | #1 | 
| Участник | какой AOS UserId соответствует определенному SID в Oracle 
			
			Все процессы Ах со стороны Oracle выглядят как процессы юзера "Axapta". Можно ли вычислить какой AOS UserId соответствует какому SID в Oracle? Зверушка Ах должна гдето эту информацию хранить. Может кто ковырял в этом направлении? Мечта отлавливать UserId "активистов", нагибающих Oracle (всего у нас под 100 человек постоянно онлайн). Д.К. | 
|  | 
|  28.05.2002, 12:26 | #2 | 
| ---------------- | 
			
			Есть формочка Администрирование\Пользователи\"Активные пользователи" Для каждого userId выводится SPID... Для M$ это соответствует SPID на SQL-сервере Может и для Oracle прокатит. | 
|  | 
|  01.03.2005, 09:45 | #3 | 
| Участник | 
			
			Цитата <Для каждого userId выводится SPID... Для M$ это соответствует SPID на SQL-сервере Может и для Oracle прокатит. > В Оракле это к сожалению не катит Для меня этот вопрос так и остался актуальный. Может кто-то его уже решил? Что надо поправить в форме "Активные пользователи" чтоб увидеть SID оракла? | 
|  | 
|  01.03.2005, 10:15 | #4 | 
| Модератор | 
			
			Говорят, ребята из CITP эту траблу решили. И сделали в виде утилиты. Но она сильно платная   Нам пока решить эту траблу не удалось... Есть идеи у кого-нибудь? С Уважением, Георгий. | 
|  | 
|  01.03.2005, 16:44 | #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). | |
|  23.12.2008, 12:26 | #6 | 
| Участник | |
|  | 
|  24.12.2008, 12:28 | #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 | 
|  | 
|  24.12.2008, 12:34 | #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 | 
|  | 
|  30.06.2009, 15:56 | #9 | 
| Участник | Up 
			
			Приподниму вопросик. А можно ли непосредственно в оракле получить userId по сессии. Т.е. вроде того "мы берем вьюху v$session, джойним к ней таблицу/вьюху Х и получаем userId для конкретной сессии "
		 | 
|  | 
|  30.06.2009, 19:29 | #10 | 
| Участник | 
			
			Afaik непосредственно в Оракле без допиливания Аксапты (причем, видимо, на уровне ядра) - нельзя.Для этого нужно, чтобы информация о сессиях и соотв. пользователях отражалась в БД, а она сейчас вроде есть лишь в памяти АОСа в виде соотв.объектов/структур данных. Более того, как уже отмечалось, в общем случае в Аксапте нельзя идентифицировать пользователя (точнее, сессию) по SPID'у. Это связано с тем, что АОС держит у себя несколько подключений к БД, которые используются при необходимости той или иной сессией аналогично рабочим потокам в СУБД, обрабатывающим пользовательские запросы. В зависимости от нагрузки АОС может прибивать неактивные подключения к БД либо создавать новые - и все это при постоянно висящих пользовательских сессиях. Соотв., со стороны СУБД видны лишь данные, соответствующие подключениям к БД, поэтому идентифицировать по ним конкретную сессию на АОСе и, соотв., пользователя, в общем случае нельзя. Это было бы возможно, если бы АОС постоянно поддерживал в актуальном состоянии некую табличку в БД, где сопоставлял бы номер сессии (или код пользователя) и используемые ей в данный момент SPID'ы и обновлял бы эту табличку каждый раз, когда перечень SPID'ов, используемых той или иной сессией, изменяется.
		 | 
|  | |
| За это сообщение автора поблагодарили: greench (1). | |
|  01.07.2009, 10:00 | #11 | 
| Участник | 
			
			Где-то так я себе это и представлял. Спасибо за ответ.
		 | 
|  | 
|  01.07.2009, 11:38 | #12 | 
| NavAx | 
			
			С интересом слежу за обсуждением, решил вставить свои 5 копеек. Я в качестве временной меры создал такую табличку (SessionId->SPID) )и веду её пока пакетниками, работающими на каждом сервере. Подпатчил формы активных пользователей и блокировок, дабы они её пользовались. Внешняя софтина, по очереди подключающаяся через COM ко всем AOS и обновляющая таблицу - в процессе разработки, всё руки не доходят. Для отслеживания блокировок пока вполне хватает обновления раз в минуту.  P.S. Я на SQL Server живу, если интересно. 
				__________________ Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...   | 
|  | 
|  01.07.2009, 11:58 | #13 | 
| Участник | 
			
			Мне просто нужны были аргументы, что делать такие вещи со стороны оракла не корректно. Гораздо проще и разумнее сделать запрос из аксапты.
		 | 
|  |