Страница 1 из 1
идентификатор вставленной записи
Добавлено: 01 дек 2005, 13:38
igorigor
Репликация в базе происходит примерно так: в ЛБД формируются скрипты по нужным данным, и прогоняются через хр проц в УБД
Проблема - когда в ЛБД формируется скрипт я не знаю какой будет идент у вставляемой записи в УБД, затем я должен его(идентификатор) вернуть в ЛБД
-- процедура begin
-вставляю запись INSERT INTO CLIENT (..) VALUES (...)
-получаю ее идент, получаю так
select first(1) from client order by id desc
-- процедура end
Вопрос, а не получится ли что кто то вставит клиента между моей вставкой и получением id? и я получу не тот идентификатор?
Добавлено: 01 дек 2005, 13:56
kdv
Добавлено: 01 дек 2005, 15:35
Ivan_Pisarevsky
-- процедура begin
-вставляю запись INSERT INTO CLIENT (..) VALUES (...)
-получаю ее идент, получаю так
select first(1) from client order by id desc
-- процедура end
-- процедура begin
select gen_id(my_generator,1) as id_field from rdb$database into id_field;
-вставляю запись INSERT INTO CLIENT (id_field_with_primary_key,...) VALUES (:id_field, ...)
-получаю ее идент, получаю так
select * from client where id_field_with_primary_key = :id_field;
-- процедура end

Добавлено: 02 дек 2005, 11:28
igorigor
понимаешь, данные реплицируются от разных таблиц через одну единственную процедуру, и я не знаю генератора для текущей таблицы
Добавлено: 02 дек 2005, 11:30
igorigor
читал, а есть какой нибудь способ это сделать, не резервируя идентификатор через генератор заранее?
Добавлено: 02 дек 2005, 12:44
Merlin
igorigor писал(а):
понимаешь, данные реплицируются от разных таблиц через одну единственную процедуру, и я не знаю генератора для текущей таблицы
А какого рожна репликатор вообще меняет ID записей, получаемых с другой базы, а не пишет те, что есть?
Добавлено: 02 дек 2005, 13:51
Ivan_Pisarevsky
Чё то в моей голове на счет твово вопросу дебет с кредитом не сходится... Человек я темный из провинции ну нифига не понял чего ты там хочешь...
Коль уж ты в процедуре имеешь данные, которые вствляешь так с какого перепугу их снова селектить? эт чтоб сервер не бездейтвовал?
-Пап, а пап, ХОЧУ ЧТОБ СЛОНИКИ БЕГАЛИ !!!
-Дык они уж с утра бекают, устали...
-А Я ХОЧУ !!!
-Хм... ну ладно... ВЗВОД !!! Газовая атака, бегом марш !!!
Добавлено: 03 дек 2005, 21:32
igorigor
Merlin писал(а):
А какого рожна репликатор вообще меняет ID записей, получаемых с другой базы, а не пишет те, что есть?
Когда в УБД вставляется запись соответствующая записи в ЛБД, сраьатывает генератор на вставку для нужной таблицы, запись вставляется хранимой процедурой, эта хп должна вернуть в лбд этот идентификатор, чтобы когда запись в лбд изменится по нему можно было узнать какую запись следует проапдейтить в убд...
РЕБЯТА! все что мне нужно знать это - есть ли способ узнать идент вставленной записи заранеее не резервируя его!
Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
Добавлено: 03 дек 2005, 21:34
igorigor
Ivan_Pisarevsky писал(а):Чё то в моей голове на счет твово вопросу дебет с кредитом не сходится... Человек я темный из провинции ну нифига не понял чего ты там хочешь...
Коль уж ты в процедуре имеешь данные, которые вствляешь так с какого перепугу их снова селектить? эт чтоб сервер не бездейтвовал?
-Пап, а пап, ХОЧУ ЧТОБ СЛОНИКИ БЕГАЛИ !!!
-Дык они уж с утра бекают, устали...
-А Я ХОЧУ !!!
-Хм... ну ладно... ВЗВОД !!! Газовая атака, бегом марш !!!
ага, именно для этого
Добавлено: 03 дек 2005, 22:22
kdv
РЕБЯТА! все что мне нужно знать это - есть ли способ узнать идент вставленной записи заранеее не резервируя его!
Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
лучше не строить из себя возмущенного, и таки прочитать тот документ, на который я тебе дал ссылку.
http://www.ibase.ru/devinfo/generator.htm
там как раз есть пример получения значения генератора из процедуры. Или, может, тебе процитировать?
Добавлено: 05 дек 2005, 09:17
igorigor
kdv писал(а):лучше не строить из себя возмущенного, и таки прочитать тот документ, на который я тебе дал ссылку.
http://www.ibase.ru/devinfo/generator.htm
там как раз есть пример получения значения генератора из процедуры. Или, может, тебе процитировать?
Спасибо, очень интересная статья

Если ты имел в виду вот это
SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE
я конечно порой бываю глуп, но не до такой же степени,
зная генератор любой может получить его значение,
а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...
Добавлено: 05 дек 2005, 09:30
kdv
нет, я имел в виду не это. читай еще раз. опять же говорю - читай в этой статье ПРО ПРОЦЕДУРЫ.
а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
НЕТ. вот сколько у меня в правом кармане брюк денег, и есть ли он вообще (карман)?
Добавлено: 05 дек 2005, 12:37
Merlin
igorigor писал(а):
Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
Собсно, я хотел всего лишь уяснить, почему ты не используешь любой из трёх распространённых методов обеспечения уникальности первичных ключей в распределённых базах. Таблицы соответствия нужны только в одном случае - когда природа данных (не организация программы) такова, что одни и те же записи могут вставляться в разных базах и одни и те же поля в редактироваться в разных базах и ни одним из приёмов струкутрной организации данных этого не избежать. И, возможно, что-то порекомендовать. Теперь же отвечу коротко -
@#%&@#$.
2 kdv на выстрел из плюсомёта не обижусь.
Добавлено: 17 дек 2005, 07:41
VictorIn
igorigor писал(а):а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...
Сделай только один генератор, обслуживающий все таблицы в базе, если тебя не смущает последующая дырявость в индексах. (типа "суррогатный ключ").
Будешь всегда и везде знать, как этот генератор зовут.

- он же один.
Меня тут, правда, могут отругать за такие советы.
А если серьезно, у тебя наверное стоит проблема соблюдения уникальности идентификаторов в общем пространстве всех удаленных баз, для обеспечения репликации.
Вот здесь почитай по этому поводу:
http://www.osp.ru/os/2001/12/045.htm
Вообще, на этом сайте есть еще несколько статей по поводу репликации.
Я лично тупо делал: генераторы для идентификаторов использовал с шагом n, где n - количество удаленных баз.
Ну и все генераторы при этом, в разных базах должны стартовать со своего значения i, где i – номер удаленной базы.
N и I лучше хранить в отдельных генераторах, как константы и в случае увеличения количества удаленных баз, их менять.
Самый простой случай при двух удаленных базах: в одной все идентификаторы четные, в другой – нечетные.
Опять же, будет дырявость в индексах, если базы заполняются неравномерно. Но мне кажется такой способ самый дешевый.