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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
HighTower
Сообщения: 5
Зарегистрирован: 18 июл 2005, 17:05

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

Сообщение HighTower » 18 июл 2005, 17:25

Привет.

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 июл 2005, 18:58

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

HighTower
Сообщения: 5
Зарегистрирован: 18 июл 2005, 17:05

Сообщение HighTower » 19 июл 2005, 11:01

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

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

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

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

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

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

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

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

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 19 июл 2005, 12:27

Ну и передавай в процедуру список ID и используй в запросе. kdv вроде даже в ФАК складывал как это делается.

HighTower
Сообщения: 5
Зарегистрирован: 18 июл 2005, 17:05

Сообщение HighTower » 19 июл 2005, 13:13

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

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

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


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


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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 19 июл 2005, 13:24

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

HighTower
Сообщения: 5
Зарегистрирован: 18 июл 2005, 17:05

Сообщение HighTower » 19 июл 2005, 13:37

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
?

Ответить