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