:: Архив конференции по VFP до 2005 года
Перенос таблиц в БД с измененной структурой
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().
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Urusov Alex

Сообщений: 270
Откуда: Россия МО г.Домодедово
Дата регистрации: 13.09.2002
Отключи в новой таблице автоинкременция ключевого поля, переносишь данные, включаешь автоинкременцию, ставишь для следующего значения ключа максимальное значение из твоих
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Как именно используется NextId()? Она вставлена в DEFAULT поля? Ну, так ведь DEFAULT сработает только если значение этого поля не указано явно.

Т.е. если ты выполнишь элементарный APPEND FROM то никаких проблем не будет. NextID() просто не сработает, поскольку будет явное указание ключевого поля, на которое навешано DEFAULT.

Однако проблема переноса не исчерпывается только DEFAULT-значениями. Если есть триггера на вставку, то их надо отключать - это опять же ALTER TABLE. А если еще надо вычислить новые значения новых полей, то надо отлкючить и треггера на модификацию. Да, еще надо отключить правила (RULE)

В общем случае, дешевле именно модифицировать структуру существующей базы данных через ALTER TABLE чем делать копирование данных в "чистую" базу данных.




------------------
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Lavrov
Автор

Сообщений: 72
Откуда: Новосибирск
Дата регистрации: 05.02.2005
Дык, я про это писал. Просто по всем таблицам ручками лазить неохота. Проблема в том, что заказчик снова может "придумать" что-либо, вследствие чего может поменяться структура БД, в то же время "данные нужны старые в новом обличье".

Вопросец: можно ли программно изменить Default Value в таблице. Вроде того, что пробегаешь все таблицы, где есть в Default Value NextKey() запоминаешь где-нибудь, обнуляешь его. Потом перенос данных и обратная операция. Я понимаю что это храниться в DBC-файле, но ГДЕ и насколько корректно его править напрямую?
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Lavrov
Автор

Сообщений: 72
Откуда: Новосибирск
Дата регистрации: 05.02.2005
Меня как раз эта проблема и волнует. В БД используются триггеры. Честно сказать сгенерированные Фоксом. И если пользовать ALTER TABLE, то связи конечно я пропишу, а как быть с триггерами?
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Проще всего сделать следующим образом:

1) Используя ALTER TABLE в старой базе создаешь все дополнительные поля и модифицируешь старые. Также создаешь дополнительные индексы, если это необходимо. Т.е. приводишь структуру таблиц к тому виду, который должен быть в новой базе данных.

2) Заполняешь эти новые поля, если необходимо

3) Заменяешь 3 файла контейнера базы данных (DBC, DCT, DCX) на новые, поставляемый при обновлении.

Все! Все триггера и связи прописаны в контейнере базы данных. Вне него только структура таблиц и индексов и их-то как раз и надо создать по ALTER TABLE.




------------------
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Lavrov
Автор

Сообщений: 72
Откуда: Новосибирск
Дата регистрации: 05.02.2005
Т.е. если я правильно понял то с помощью ALTER TABLE модифицируем таблицы, входящие в БД (без связей), т.е. данные остаются старые - структура таблиц - новая. А что-бы работали все триггеры, то из предварительно созданной (и протестированной) новой БД копируем вышеупомянутые три файла. В них как раз и прописаны связи, триггеры и т.д.

Я правильно понял?

Спасибо огромное за помощь.
Ratings: 0 negative/0 positive
Re: Перенос таблиц в БД с измененной структурой
Владимир Максимов

Сообщений: 14093
Откуда: Москва
Дата регистрации: 02.09.2000
Да. Общая идея именно такая.




------------------
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика