Запросы на перенос данных в действующей базе данных?

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

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

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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
3 815
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

John Mo 16.01.2009 18:55
Ответ принят как подходящий

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

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

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

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

Похоже, это сработает. Тогда мне придется сделать это снова, когда новая база данных начнет работать, чтобы захватить все последующие данные, но это должно произойти в любом случае

Tony Peterson 16.01.2009 17:45

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме