идентификатор вставленной записи
Модератор: kdv
идентификатор вставленной записи
Репликация в базе происходит примерно так: в ЛБД формируются скрипты по нужным данным, и прогоняются через хр проц в УБД
Проблема - когда в ЛБД формируется скрипт я не знаю какой будет идент у вставляемой записи в УБД, затем я должен его(идентификатор) вернуть в ЛБД
-- процедура begin
-вставляю запись INSERT INTO CLIENT (..) VALUES (...)
-получаю ее идент, получаю так
select first(1) from client order by id desc
-- процедура end
Вопрос, а не получится ли что кто то вставит клиента между моей вставкой и получением id? и я получу не тот идентификатор?
Проблема - когда в ЛБД формируется скрипт я не знаю какой будет идент у вставляемой записи в УБД, затем я должен его(идентификатор) вернуть в ЛБД
-- процедура begin
-вставляю запись INSERT INTO CLIENT (..) VALUES (...)
-получаю ее идент, получаю так
select first(1) from client order by id desc
-- процедура end
Вопрос, а не получится ли что кто то вставит клиента между моей вставкой и получением id? и я получу не тот идентификатор?
получится. читать www.ibase.ru/devinfo/generator.htm
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
-- процедура 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

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

SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE
я конечно порой бываю глуп, но не до такой же степени,
зная генератор любой может получить его значение,
а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...
Собсно, я хотел всего лишь уяснить, почему ты не используешь любой из трёх распространённых методов обеспечения уникальности первичных ключей в распределённых базах. Таблицы соответствия нужны только в одном случае - когда природа данных (не организация программы) такова, что одни и те же записи могут вставляться в разных базах и одни и те же поля в редактироваться в разных базах и ни одним из приёмов струкутрной организации данных этого не избежать. И, возможно, что-то порекомендовать. Теперь же отвечу коротко - @#%&@#$.igorigor писал(а): Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
2 kdv на выстрел из плюсомёта не обижусь.
Сделай только один генератор, обслуживающий все таблицы в базе, если тебя не смущает последующая дырявость в индексах. (типа "суррогатный ключ").igorigor писал(а):а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...
Будешь всегда и везде знать, как этот генератор зовут.

Меня тут, правда, могут отругать за такие советы.

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