Страница 1 из 1

IB 7.0: узнать откуда коннект

Добавлено: 18 июл 2005, 17:25
HighTower
Привет.

собственно вопрос такой, можно ли в хранимой процедуре узнать откуда данный юзер подключился? ип машины или доменное имя...
нужно для того, чтобы юзер с одним именем мог коннектится с разных машин к базе _одновременно_ и при этом убеспечить некоторую уникальность данных...

Добавлено: 18 июл 2005, 18:58
kdv
юзер и так может коннектиться с разных машин.
уникальность лучше обеспечить взводя генератор.
проверять юзера через tmp$attachments - посложнее будет, но тоже можно. Но - на сервере есть _список_ подсоединившихся юзеров. и их ip( и остальная инфа). Но как ты узнаешь, что именно конкретный юзер - тот, кто запустил процедуру?
imho проще проверять уникальность запуска процедуры через tmp$procedures.

Добавлено: 19 июл 2005, 11:01
HighTower
kdv писал(а):Но как ты узнаешь, что именно конкретный юзер - тот, кто запустил процедуру?
imho проще проверять уникальность запуска процедуры через tmp$procedures.
мдя.. согласен... не узнать...

ладно, опишу тогда что требуется, может посоветуете решение...

использую процедуры для формирования данных, которые потом отдаются проге и она на их основе рисует отчёт.
в процедуре сообственно ждойнятся несколько таблиц и представлений,а потом в цикле for ещё в зависимости от условий если надо берётся инфа из ещё одной таблицы + несложные расчёты...

работает, вроде даже не тормозит... в выходных данных есть поле идентификатора.
соответвенно потом програ делает

select * from my_proc(params)
where id in (....)

и получается, что процедура обрабатывает совершенно все данные, даже которые и не нужны на выходе...

идея моя была в том, что при логине к базе юзера, создавать временную таблицу с имемен "user_name_ip" и одной колонкой ID, перед тем как сформировать отчёт, в эту таблицу загоняются нужные значения, а потом процедура в своих селектах делает нужные where id in ...

если сделать одну общую таблицу, то возникнет ситуация, когда несколько юзеров одновременно будут делать отчёты, данные перемешаются....

собственно вот.

Добавлено: 19 июл 2005, 12:27
Merlin
Ну и передавай в процедуру список ID и используй в запросе. kdv вроде даже в ФАК складывал как это делается.

Добавлено: 19 июл 2005, 13:13
HighTower
Merlin писал(а):Ну и передавай в процедуру список ID и используй в запросе. kdv вроде даже в ФАК складывал как это делается.
о, респект!!! то что надо, а как скорость выросла!!! просто сказка!

значит если кому надо:

Select тыры-пыры
From Table T
Where :ParamStr Containing '~'||T.ID||'~'


вопрос только такой ParamStr - делать varchar? и какой лучше длины, чтоб перерасхода памяти не было?


а если мне надо вдруг чтобы вибиралось всё таки всё, то я модифицировал вот так:
Where (:ParamStr Containing '~'||T.ID||'~' or :ParamStr = '*')

Добавлено: 19 июл 2005, 13:24
Merlin
HighTower писал(а): вопрос только такой ParamStr - делать varchar? и какой лучше длины, чтоб перерасхода памяти не было?
Ессно. А длина - твоя задача, тебе видней сколько их там можно ожидать.
HighTower писал(а): а если мне надо вдруг чтобы вибиралось всё таки всё, то я модифицировал вот так:
Where (:ParamStr Containing '~'||T.ID||'~' or :ParamStr = '*')
На ифе разбирай - при пустой строке другой запрос.

Добавлено: 19 июл 2005, 13:37
HighTower
Merlin писал(а):На ифе разбирай - при пустой строке другой запрос.
пустой - когда в процедуру передали пустой список параметров? так это прога контролирует...

или ты предлагаешь что то вроде такого:

Код: Выделить всё

for select .....
     where ....
     into ....
 do
  begin
     get = false;
     if ( :list = '' ) get = true;
     else if ( :list containing '~'||t.id||'~' ) get = true;
   
     if ( get = true )
     begin
 
         ....    

     end
  end
?