Запросы для переноса данных в оперативную базу данных? - PullRequest
2 голосов
/ 16 января 2009

Я пишу код для переноса данных из нашей действующей базы данных Access в новую базу данных Sql Server, которая имеет другую схему с реорганизованной структурой. Эта база данных Sql Server будет использоваться с новой версией нашего приложения в разработке.

Я писал код миграции на C #, который вызывает Sql Server и Access и преобразует данные по мере необходимости. Я впервые перенес таблицу, в которой есть записи, связанные с новыми записями другой таблицы, которые я недавно не обновлял, и это вызвало ошибку, поскольку не удалось найти запись в соответствующей таблице в SQL Server

Итак, моя производственная таблица SqlServer содержит данные только до 1/14/09, и я продолжаю переносить больше таблиц из Access. Поэтому я хочу написать метод обновления, который может выяснить, что нового есть в Access, который не был отражен в Sql Server.

Моя текущая идея состоит в том, чтобы написать запрос на стороне SQL, который выполняет SELECT Max (RunDate) FROM ProductionRuns, чтобы дать мне самую последнюю дату в этом поле в таблице. На стороне доступа я написал бы запрос, который выполняет SELECT * FROM ProductionRuns WHERE RunDate>?, Где параметр - это максимальная дата, найденная в SQL Server, и выполнил мой шаг перевода в коде, а затем вставил новые данные в Sql Server ,

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

Редактировать: Я сделал копию текущей действующей базы данных. Который я могу затем перенести, не беспокоясь об изменениях, затем использовать его для тестирования во время разработки, а затем я могу переносить последние данные всякий раз, когда новая база данных и приложение запускаются.

Ответы [ 5 ]

4 голосов
/ 16 января 2009

Лично я бы разделил процесс на два этапа.

  1. Я бы создал точную копию БД Access в SQLServer и скопировал бы все данные
  2. Скопируйте данные из этой временной базы данных SQLServer в базу данных назначения

Таким образом, вы можете написать набор кода SQL для выполнения задачи второго шага

В качестве альтернативы используйте SSIS

2 голосов
/ 16 января 2009

Обычно, когда вы конвертируете данные в новую базу данных, которая займет свое место в области переноса, вы отключаете всех пользователей базы данных на некоторое время, запускаете миграцию и включаете новую базу данных. Это гарантирует, что во время преобразования не вносятся изменения в данные. Конечно, я бы никогда не сделал это с помощью c #. Миграция данных является задачей базы данных и должна была быть выполнена в SSIS (или DTS, если у вас более старая версия SQL Server).

Если база данных, в которую вы конвертируете, находится в стадии разработки, я бы создал резервную копию базы данных Access и загрузил бы оттуда данные, чтобы проверить процесс загрузки данных и получить данные, чтобы вы могли заниматься разработкой приложения. Затем, когда пришло время выполнить реальную загрузку, вы просто закрываете реальную базу данных для пользователей и используете ее для загрузки. Если вы пытаетесь синхронизировать оба файла, пока вы разрабатываете, я бы не стал этого делать, но если вам нужно, сделайте ночное резервное копирование файла и загрузите первым делом утром, используя ваш процесс.

1 голос
/ 16 января 2009

Если вы довольны кодом C #, но он не работает из-за ограничений в вашей целевой базе данных, вы временно можете отключить их, а затем включить после копирования всего лота .

Я предполагаю, что вашей целевой базой данных является новая БД без данных, и никто не использует ее при передаче

1 голос
/ 16 января 2009

Возможно, вы захотите инвестировать в такой инструмент, как Сравнение данных SQL .

Я считаю, что он также поддерживает базы данных доступа, и вы можете загрузить пробную версию.

0 голосов
/ 16 января 2009

Похоже, у вас есть две проблемы:

  1. Вы переносите данные из одной базы данных в другую.
  2. Вы меняете свою схему.

Выполнить любое из этих действий сложно, если вы пытаетесь перенести данные, когда люди их используют.

Самый простой подход заключается в переносе данных на основе статической копии данных, а также в очередь обновлений этих данных с момента захвата статической копии. Я не знаю, насколько это легко в Access, но в SQLServer или Oracle вы можете использовать журналы повторов для этого или ручное решение с использованием триггеров. Способ бедняка заключается в том, чтобы сделать триггеры для всех соответствующих таблиц, которые регистрируют первичный ключ записей, которые изменились. Затем, после того как старая база данных отключена, вы можете перебирать эти ключи, получать эти записи из старой базы данных и помещать их в новую базу данных. Просто скопируйте всю запись; если запись была удалена, то удалите ее из новой базы данных.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...