идентификатор вставленной записи

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

идентификатор вставленной записи

Сообщение igorigor » 01 дек 2005, 13:38

Репликация в базе происходит примерно так: в ЛБД формируются скрипты по нужным данным, и прогоняются через хр проц в УБД

Проблема - когда в ЛБД формируется скрипт я не знаю какой будет идент у вставляемой записи в УБД, затем я должен его(идентификатор) вернуть в ЛБД

-- процедура begin
-вставляю запись INSERT INTO CLIENT (..) VALUES (...)
-получаю ее идент, получаю так
select first(1) from client order by id desc
-- процедура end

Вопрос, а не получится ли что кто то вставит клиента между моей вставкой и получением id? и я получу не тот идентификатор?

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

Сообщение kdv » 01 дек 2005, 13:56

получится. читать www.ibase.ru/devinfo/generator.htm

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 01 дек 2005, 15:35

-- процедура 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

:)

igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

Сообщение igorigor » 02 дек 2005, 11:28

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

igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

Сообщение igorigor » 02 дек 2005, 11:30

читал, а есть какой нибудь способ это сделать, не резервируя идентификатор через генератор заранее?

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

Сообщение Merlin » 02 дек 2005, 12:44

igorigor писал(а)::D
понимаешь, данные реплицируются от разных таблиц через одну единственную процедуру, и я не знаю генератора для текущей таблицы
А какого рожна репликатор вообще меняет ID записей, получаемых с другой базы, а не пишет те, что есть?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 02 дек 2005, 13:51

Чё то в моей голове на счет твово вопросу дебет с кредитом не сходится... Человек я темный из провинции ну нифига не понял чего ты там хочешь...

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

-Пап, а пап, ХОЧУ ЧТОБ СЛОНИКИ БЕГАЛИ !!!
-Дык они уж с утра бекают, устали...
-А Я ХОЧУ !!!
-Хм... ну ладно... ВЗВОД !!! Газовая атака, бегом марш !!!

igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

Сообщение igorigor » 03 дек 2005, 21:32

Merlin писал(а): А какого рожна репликатор вообще меняет ID записей, получаемых с другой базы, а не пишет те, что есть?
Когда в УБД вставляется запись соответствующая записи в ЛБД, сраьатывает генератор на вставку для нужной таблицы, запись вставляется хранимой процедурой, эта хп должна вернуть в лбд этот идентификатор, чтобы когда запись в лбд изменится по нему можно было узнать какую запись следует проапдейтить в убд...

РЕБЯТА! все что мне нужно знать это - есть ли способ узнать идент вставленной записи заранеее не резервируя его!

Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!

igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

Сообщение igorigor » 03 дек 2005, 21:34

Ivan_Pisarevsky писал(а):Чё то в моей голове на счет твово вопросу дебет с кредитом не сходится... Человек я темный из провинции ну нифига не понял чего ты там хочешь...

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

-Пап, а пап, ХОЧУ ЧТОБ СЛОНИКИ БЕГАЛИ !!!
-Дык они уж с утра бекают, устали...
-А Я ХОЧУ !!!
-Хм... ну ладно... ВЗВОД !!! Газовая атака, бегом марш !!!
ага, именно для этого

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

Сообщение kdv » 03 дек 2005, 22:22

РЕБЯТА! все что мне нужно знать это - есть ли способ узнать идент вставленной записи заранеее не резервируя его!

Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
лучше не строить из себя возмущенного, и таки прочитать тот документ, на который я тебе дал ссылку.
http://www.ibase.ru/devinfo/generator.htm

там как раз есть пример получения значения генератора из процедуры. Или, может, тебе процитировать?

igorigor
Сообщения: 16
Зарегистрирован: 25 фев 2005, 13:51

Сообщение igorigor » 05 дек 2005, 09:17

kdv писал(а):лучше не строить из себя возмущенного, и таки прочитать тот документ, на который я тебе дал ссылку.
http://www.ibase.ru/devinfo/generator.htm

там как раз есть пример получения значения генератора из процедуры. Или, может, тебе процитировать?
Спасибо, очень интересная статья
:) Если ты имел в виду вот это
SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE
я конечно порой бываю глуп, но не до такой же степени,
зная генератор любой может получить его значение,
а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...

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

Сообщение kdv » 05 дек 2005, 09:30

нет, я имел в виду не это. читай еще раз. опять же говорю - читай в этой статье ПРО ПРОЦЕДУРЫ.
а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
НЕТ. вот сколько у меня в правом кармане брюк денег, и есть ли он вообще (карман)?

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

Сообщение Merlin » 05 дек 2005, 12:37

igorigor писал(а): Хватит издеваться и стоить из себя умников, неужели неьзя ответить по существу или просто промолчать!
Собсно, я хотел всего лишь уяснить, почему ты не используешь любой из трёх распространённых методов обеспечения уникальности первичных ключей в распределённых базах. Таблицы соответствия нужны только в одном случае - когда природа данных (не организация программы) такова, что одни и те же записи могут вставляться в разных базах и одни и те же поля в редактироваться в разных базах и ни одним из приёмов струкутрной организации данных этого не избежать. И, возможно, что-то порекомендовать. Теперь же отвечу коротко - @#%&@#$.

2 kdv на выстрел из плюсомёта не обижусь.

VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

Сообщение VictorIn » 17 дек 2005, 07:41

igorigor писал(а):а можно ли это сделать не зная его, если известна лишь таблица куда впердолили запись?
Видно придется мне получать для данной таблицы триггер а для него определять какой используется генератор...
Сделай только один генератор, обслуживающий все таблицы в базе, если тебя не смущает последующая дырявость в индексах. (типа "суррогатный ключ").
Будешь всегда и везде знать, как этот генератор зовут. :lol: - он же один.
Меня тут, правда, могут отругать за такие советы. :twisted:

А если серьезно, у тебя наверное стоит проблема соблюдения уникальности идентификаторов в общем пространстве всех удаленных баз, для обеспечения репликации.
Вот здесь почитай по этому поводу: http://www.osp.ru/os/2001/12/045.htm

Вообще, на этом сайте есть еще несколько статей по поводу репликации.

Я лично тупо делал: генераторы для идентификаторов использовал с шагом n, где n - количество удаленных баз.
Ну и все генераторы при этом, в разных базах должны стартовать со своего значения i, где i – номер удаленной базы.
N и I лучше хранить в отдельных генераторах, как константы и в случае увеличения количества удаленных баз, их менять.
Самый простой случай при двух удаленных базах: в одной все идентификаторы четные, в другой – нечетные.
Опять же, будет дырявость в индексах, если базы заполняются неравномерно. Но мне кажется такой способ самый дешевый.

Ответить