Перенос таблиц в БД с измененной структурой | |
---|---|
Lavrov Сообщений: 72 Откуда: Новосибирск Дата регистрации: 05.02.2005 |
Добрый день.
Есть БД с таблицами: (упрощенная структура) Zakaz.dbf 1. IdZakaz 2. IdClient 3. IdModel ... Cоответственно, есть справочники клиентов Client (IdClient) и моделей автомобилей Model (IdModel). Поля Zakaz.IdZakaz, Client.IdClient и Model.IdModel - первичные ключи и вычисляются функцией NextId(), хранимой в хранимых процедурах (извините за тафталогию). Возникла необходимость добавить таблицу бренд (марка авто). Таким образом Zakaz.dbf изменится следующим образом: Zakaz.dbf 1. IdZakaz 2. IdClient 3. IdModel 4. IdMarka ... Слышу возмущенные реплики, типа - это неправильно с точки зрения нормализации и т.д. Суть не в этом. Есть наработанные за год заказы с первой структурой. Нужно эти данные перенести во вторую структуру с сохранением Id. Проблема в том, что при переносе Id будут заново генериться, а т.к. таблиц на самом деле много, то тяжеловато отслеживать все дочерние таблицы. Я подумал, что можно на время переноса отключать NextKey(), но для этого опять же нужно модифицировать каждую таблицу. Может есть другие способы? Заранее спасибо. P.S. ALTER TABLE не катит - на самом деле вышеизложенное это сильно упрощенная ситуация, т.е. добавление поля в таблицу и создание MARKA.DBF - не то. Вопрос именно в том, КАК В БД С РАСШИРЕННОЙ (измененной) СТРУКТУРОЙ занести данные из другой БД, не изменяя ID, генерируемой функцией NextId(). |
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Urusov Alex Сообщений: 270 Откуда: Россия МО г.Домодедово Дата регистрации: 13.09.2002 |
Отключи в новой таблице автоинкременция ключевого поля, переносишь данные, включаешь автоинкременцию, ставишь для следующего значения ключа максимальное значение из твоих
|
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Владимир Максимов Автор Сообщений: 14093 Откуда: Москва Дата регистрации: 02.09.2000 |
Как именно используется NextId()? Она вставлена в DEFAULT поля? Ну, так ведь DEFAULT сработает только если значение этого поля не указано явно.
Т.е. если ты выполнишь элементарный APPEND FROM то никаких проблем не будет. NextID() просто не сработает, поскольку будет явное указание ключевого поля, на которое навешано DEFAULT. Однако проблема переноса не исчерпывается только DEFAULT-значениями. Если есть триггера на вставку, то их надо отключать - это опять же ALTER TABLE. А если еще надо вычислить новые значения новых полей, то надо отлкючить и треггера на модификацию. Да, еще надо отключить правила (RULE) В общем случае, дешевле именно модифицировать структуру существующей базы данных через ALTER TABLE чем делать копирование данных в "чистую" базу данных. ------------------ |
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Lavrov Сообщений: 72 Откуда: Новосибирск Дата регистрации: 05.02.2005 |
Дык, я про это писал. Просто по всем таблицам ручками лазить неохота. Проблема в том, что заказчик снова может "придумать" что-либо, вследствие чего может поменяться структура БД, в то же время "данные нужны старые в новом обличье".
Вопросец: можно ли программно изменить Default Value в таблице. Вроде того, что пробегаешь все таблицы, где есть в Default Value NextKey() запоминаешь где-нибудь, обнуляешь его. Потом перенос данных и обратная операция. Я понимаю что это храниться в DBC-файле, но ГДЕ и насколько корректно его править напрямую? |
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Lavrov Сообщений: 72 Откуда: Новосибирск Дата регистрации: 05.02.2005 |
Меня как раз эта проблема и волнует. В БД используются триггеры. Честно сказать сгенерированные Фоксом. И если пользовать ALTER TABLE, то связи конечно я пропишу, а как быть с триггерами?
|
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Владимир Максимов Автор Сообщений: 14093 Откуда: Москва Дата регистрации: 02.09.2000 |
Проще всего сделать следующим образом:
1) Используя ALTER TABLE в старой базе создаешь все дополнительные поля и модифицируешь старые. Также создаешь дополнительные индексы, если это необходимо. Т.е. приводишь структуру таблиц к тому виду, который должен быть в новой базе данных. 2) Заполняешь эти новые поля, если необходимо 3) Заменяешь 3 файла контейнера базы данных (DBC, DCT, DCX) на новые, поставляемый при обновлении. Все! Все триггера и связи прописаны в контейнере базы данных. Вне него только структура таблиц и индексов и их-то как раз и надо создать по ALTER TABLE. ------------------ |
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Lavrov Сообщений: 72 Откуда: Новосибирск Дата регистрации: 05.02.2005 |
Т.е. если я правильно понял то с помощью ALTER TABLE модифицируем таблицы, входящие в БД (без связей), т.е. данные остаются старые - структура таблиц - новая. А что-бы работали все триггеры, то из предварительно созданной (и протестированной) новой БД копируем вышеупомянутые три файла. В них как раз и прописаны связи, триггеры и т.д.
Я правильно понял? Спасибо огромное за помощь. |
Re: Перенос таблиц в БД с измененной структурой | |
---|---|
Владимир Максимов Автор Сообщений: 14093 Откуда: Москва Дата регистрации: 02.09.2000 |
Да. Общая идея именно такая.
------------------ |
© 2000-2024 Fox Club  |