Добрый день,
Есть таблица employees с primary key EID, этот EID заполняется в триггере. Сейчас просто накручивается счетчик на 1 и используется это значение в качестве нового EID.
Необходимо сделать так, чтоб перед тем, как выдать новый EID производиласть проверка на предмет попадания его значения в один из диапазонов и в случае отрицательного результата накручивать до первого значения следующего диапазона. Диапазоны хранятся в таблице ranges (fromid, toid).
этот процесс я представляю следующим образом (код триггера на вставку):
tmpid = gen_id(gen_employees, 1);
select count(*)
from ranges
where tmpid between fromid and toid
into :a;
if (a=0) then
begin
select min(fromid)
from ranges
where tmpid<fromid
into :b;
if (b is null) then exception employees_range_not_enough;
tmpid = gen_id(gen_employees, b-tmpid);
end;
new.eid = tmpid;
как отработает триггер при множественной вставке из нескольких транзакций? т.е. пока не отработает триггер по первой вставке, следующая вставка сидит и ждет? или же это может происходить параллельно? тогда может случиться так, что при истечении диапазона два триггера могут два раза промотать генератор ...