Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Процедура SYSDBOPEN. Почему не все соединения с базой отлавливает?  [new]
Сергей Б
Member

Откуда: Москва
Сообщений: 151
На сервере создал процедуры и таблицы как описаны в статье
https://www.ibm.com/developerworks/ru/library/dm-1109sysdbopen/.
Проверил, как работает (под разными пользователями через dbaccess и через сервер студио соединялся с сервером). Все работает, все фиксируется.

Добавил небольшой «кусок кода»
….
-- Теперь проверим, не знаем ли мы уже этого пользователя
SELECT count(*) INTO flag 
FROM sysdbopenuser 
WHERE who = USER 
AND db_name = my_database; 

      --add 29/06/17
	SELECT s.hostname,s.sid as ses
        INTO v_host,v_ses
	FROM sysmaster:syssessions s ,sysmaster:sysopendb b
	WHERE s.username = USER AND s.sid = DBINFO('sessionid') AND  
	      s.sid=b.odb_sessionid AND b.odb_iscurrent = 'Y';
     --end add 29/06/17

IF flag = 0			-- новая запись
….
ELSE BEGIN 
	SELECT count(*) INTO act_conn_x 
	FROM sysmaster:syssessions s, sysmaster:sysopendb o 
	WHERE s.username = USER 
	AND o.odb_dbname = my_database 
	AND o.odb_sessionid = s.sid; 

        --  add 29/06/17
        INSERT INTO sysdbopenusr 
	VALUES (USER,CURRENT year to second,null,my_database,v_host,v_ses);
       --end add 29/06/17
…..

Проверил как работает. Все работает, все фиксируется.
Начал контролировать кто и когда подсоединялся к БД. И к своему удивлению заметил, что не все фиксируется этой процедурой.

Делаю запрос к сессиям и вижу, что новые сессии появляются, но не все отображается в таблице sysdbopenuser

select sid,username,hostname,dbinfo('UTC_TO_DATETIME',connected) as connected,feprogram,state 
,current - (dbinfo('UTC_TO_DATETIME',connected) + 1 UNITS HOUR) as duration
from syssessions


Проверяю и сравниваю с запросом, который фиксирует подключение к БД в процедуре.
select * from syssessions = SELECT  * FROM sysopendb t2 {0}


но это в том случае, если во втором запросе закоментировать условие s.username = USER AND s.sid = DBINFO('sessionid').
Значит эта процедура не все соединения фиксирует. Подскажите пожалуйста, какой тип/вид соединений она не фиксирует и почему?
19 июл 17, 18:40    [20658755]     Ответить | Цитировать Сообщить модератору
 Re: Процедура SYSDBOPEN. Почему не все соединения с базой отлавливает?  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5506
Сергей Б
WHERE who = USER

так USER наверное внутри процедуры всегда = владельцу процедуры. Зачем там user вообще?
19 июл 17, 22:56    [20659277]     Ответить | Цитировать Сообщить модератору
 Re: Процедура SYSDBOPEN. Почему не все соединения с базой отлавливает?  [new]
яфшуеі
Guest
В свое время пытались настроить ограничение на количество сессий
с запросом только по sysmaster:syssessions проблем не было, ограничивало количество сессий корректно,
если клиент не использует IFX_NODBPROC.

Зачем делать связку с sysopendb? процедура и так отрабатывает только на этой БД.
На сколько я понимаю, sysdbopen работает только в случае если БД открыта как database, во всяком случае на 11.70FC5
Если мы обращаемся к таблице с другой БД - sysdbopen не отрабатывает

Т.е. запрос типа
echo "select t1.* from systables t , mydb:systables t1 where t1.tabid=1 and t.tabid=t1.tabid " | dbaccess sysmaster
на БД mydb не вызывает sysdbopen. Аналогично и для подзапроса.
19 июл 17, 23:16    [20659306]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить