IB 7.0: узнать откуда коннект
IB 7.0: узнать откуда коннект
Привет.
собственно вопрос такой, можно ли в хранимой процедуре узнать откуда данный юзер подключился? ип машины или доменное имя...
нужно для того, чтобы юзер с одним именем мог коннектится с разных машин к базе _одновременно_ и при этом убеспечить некоторую уникальность данных...
собственно вопрос такой, можно ли в хранимой процедуре узнать откуда данный юзер подключился? ип машины или доменное имя...
нужно для того, чтобы юзер с одним именем мог коннектится с разных машин к базе _одновременно_ и при этом убеспечить некоторую уникальность данных...
юзер и так может коннектиться с разных машин.
уникальность лучше обеспечить взводя генератор.
проверять юзера через tmp$attachments - посложнее будет, но тоже можно. Но - на сервере есть _список_ подсоединившихся юзеров. и их ip( и остальная инфа). Но как ты узнаешь, что именно конкретный юзер - тот, кто запустил процедуру?
imho проще проверять уникальность запуска процедуры через tmp$procedures.
уникальность лучше обеспечить взводя генератор.
проверять юзера через tmp$attachments - посложнее будет, но тоже можно. Но - на сервере есть _список_ подсоединившихся юзеров. и их ip( и остальная инфа). Но как ты узнаешь, что именно конкретный юзер - тот, кто запустил процедуру?
imho проще проверять уникальность запуска процедуры через tmp$procedures.
мдя.. согласен... не узнать...kdv писал(а):Но как ты узнаешь, что именно конкретный юзер - тот, кто запустил процедуру?
imho проще проверять уникальность запуска процедуры через tmp$procedures.
ладно, опишу тогда что требуется, может посоветуете решение...
использую процедуры для формирования данных, которые потом отдаются проге и она на их основе рисует отчёт.
в процедуре сообственно ждойнятся несколько таблиц и представлений,а потом в цикле for ещё в зависимости от условий если надо берётся инфа из ещё одной таблицы + несложные расчёты...
работает, вроде даже не тормозит... в выходных данных есть поле идентификатора.
соответвенно потом програ делает
select * from my_proc(params)
where id in (....)
и получается, что процедура обрабатывает совершенно все данные, даже которые и не нужны на выходе...
идея моя была в том, что при логине к базе юзера, создавать временную таблицу с имемен "user_name_ip" и одной колонкой ID, перед тем как сформировать отчёт, в эту таблицу загоняются нужные значения, а потом процедура в своих селектах делает нужные where id in ...
если сделать одну общую таблицу, то возникнет ситуация, когда несколько юзеров одновременно будут делать отчёты, данные перемешаются....
собственно вот.
о, респект!!! то что надо, а как скорость выросла!!! просто сказка!Merlin писал(а):Ну и передавай в процедуру список ID и используй в запросе. kdv вроде даже в ФАК складывал как это делается.
значит если кому надо:
Select тыры-пыры
From Table T
Where

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

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