Dima (KDV_83)
Участник
Offline
|
|
« : 16-11-2005 05:26 » |
|
Столкнулся вот с такой проблемой: Есть бд на InterBase(основная) она не сетевая, ввод данных производился всегда только в нее, потом я брал эту базу устанавливал пользователям (разграничал права доступа, показывал только те данные которые надо и т д) это было так раньше, Теперь сделали все наоборот: сами пользователи вводят свои данные и после их ввода я должен собрать все в основную бд Вот.... Вроде ничего трудного, сделал выборку копирую Appendom, записи добавляются, все хорошо с одного пользователя забрал, стал забирать с второго , но ни тут то было. Поле Id (при вставке записи вызыват генератор Gen_Id(IdStud,1)), и так вот у каждого пользователя этот Id повызывался и теперь у них у всех одинаковый он идет. вызвать appendom при копировании этот генератор не получается Как быть
P/S как трудно описать свои мысли, так что если кто понял меня, помогите please.....
|
|
|
Записан
|
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #2 : 16-11-2005 09:17 » |
|
Gen_Id(IdStud,1) это генератор вызываю, чтобы поле idstud на +1 увеличить, поле это имеет primary key Генерируют его сами пользователи при добавлении новой записи
|
|
|
Записан
|
|
|
|
Mouse
Молодой специалист
Offline
|
|
« Ответ #3 : 16-11-2005 10:19 » |
|
Вот это как раз не совсем верно, формированием идентификаторов пользователи заниматься не должны. Я бы организовал табличку с пользователями, в которой были бы данные вроде имени, фамилии и т.д., плюс при добавлении нового пользователя генерился бы уникальный номер. Клиент получает этот номер и указывает его каждый раз, когда хочет сохранить данные в базе. Как получать номер, это тоже вопрос. Поскольку считать комбинацию Ф+И+О уникальной нельзя, то я ввести для каждого пользователя что-то вроде пароля, тогда комбинацию ФИО+Пароль можно использовать для получения из таблички пользователя его идентификатора. Ясное дело, что люди с одинаковыми ФИО одинаковые пароли иметь не должны, но эта задача возлагается на модуль добавления новых пользователей
Слушай, а получается так, что тебе по сути нужен в качестве ID просто номер, на 1 больше последнего существующего в базе? Тогда для этого надо использовать автоинкрементные поля, в SQL Server они определяются как IDENTITY. Такие поля при вставке строки сами увеличивают себя на 1 относительно последнего значения
|
|
|
Записан
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #4 : 16-11-2005 10:37 » |
|
Правильно мне нужно чтобы этот ID был на +1 больше преидущего
Просто сейчас видишь как получилось: была одна база общая в ней например Id остановился на 14555, и теперь пользователи (7 человек) начали вводить данные каждый на своем компе т е 1 пользователь ввел 100 записей и сейчас у него Id будет 14655. Вот у первого я базу только и смог забрать, теперь второй пользователь ввел тоже 100 записей например и у него Id теперь будет 14655, т е видишь Id повторятся начали и я не могу скинуть остальных 6 человек в свою общую базу Мне теперь у себя надо как-то сделать чтобы при копировании записей их Id менялся вот это не получается у меня
|
|
|
Записан
|
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #6 : 16-11-2005 11:20 » |
|
Oldy. я именно с insertom делал сначала, при вставке новой записи вызывал генератор чтобы Id увеличивался, только там при вставке сообщение выходит что то типа "Не могу литеры поменять..." а appendom делаешь проглатывает, данные записываются
За ссылки спасибо сейчас почитаю
|
|
|
Записан
|
|
|
|
Mouse
Молодой специалист
Offline
|
|
« Ответ #7 : 16-11-2005 12:22 » |
|
Dima, при вставке данных в таблицу с автоинкрементным полем в операторе INSERT просто не нужно указывать значение для этого поля. Например, если у нас есть таблица People(ID, Name, Phone), в которой поле ID определено как IDENTITY, то оператор INSERT будет выглядеть следующим образом: INSERT INTO People VALUES ("Вася Пупкин", "123-45-67"). Как видишь, поле ID никак не фигурирует в INSERT, и тем не менее при вставке поле ID будет установлено корректно. Никаких дополнительных процедур для этого писать не надо.
|
|
|
Записан
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #8 : 17-11-2005 10:04 » |
|
У меня ведь бд InterBase в нем нет автоинкрементных полей Специально генератор вызываю при вставке
|
|
|
Записан
|
|
|
|
Mouse
Молодой специалист
Offline
|
|
« Ответ #9 : 17-11-2005 10:58 » |
|
Прочитал подробнее, въехал, и вправду нет такой возможности... Я вот только не понимаю, на каком этапе у тебя генериться ID? Должно быть так, чтобы вставка данных производилась хранимой процедурой, которая 1) блокирует таблицу на чтение для остальных порльзователей, 2) читает последний ID и генерит на его основе новый, 3) вставляет данные, 4) снимает блокировку. Что блокировок нет, это я уже знаю Нашел тут ресурсик, авось пригодится http://www.ibase.ru/devinfo/pslock.htmА если без блокировок, то можно попробовать ту же последовательность, только без пунктов 1) и 4)
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #10 : 17-11-2005 16:31 » |
|
Mouse, в Интербейзе это (автоинкрементация) делается при помощи генератора вызываемого из триггера Before Insert, а так как каждый из пользователей имеет свою собственную копию базы,то каждый генерит ключи в том-же самом диапазоне возможных значений. А поскольку в "центре" нужно иметь общую базу, образованную путем слияния клиентских баз, желательно применять методы используемые для репликации. Одним из возможных способов может быть генерация ключей (ID) в различных диапазонах. То есть ключи от ID=0 до ID=999 999 - может генерировать пользователь №1, от 1 000 000 до 1 999 999 - пользователь №2 и т.д.
|
|
« Последнее редактирование: 17-11-2005 16:36 от Oldy »
|
Записан
|
С уважением, Oldy.
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #12 : 18-11-2005 04:25 » |
|
Oldy, я об этом тоже подумал был (каждому пользователю свой диапозон ID выделять), но теперь поздно уже. Данные они уже по вводили, и заново они уже вводить не будутjavascript:void(0); Мне теперь остается только самому при копировании в общую базу этот id менять
|
|
|
Записан
|
|
|
|
Dima (KDV_83)
Участник
Offline
|
|
« Ответ #13 : 18-11-2005 06:56 » |
|
Всеjavascript:void(0); Всем спасибо Сделал
|
|
|
Записан
|
|
|
|
|