#c# #.net #sql-server #tsql #smo
#c# #.net #sql-сервер #tsql #smo
Вопрос:
Мне нужно создать инструмент, способный объединять производственные базы данных клиентов. Обычно эти базы данных будут иметь одинаковую схему (я проведу некоторые проверки позже, но пока мы будем считать, что это так). Фильтрация дублирующихся данных — это тоже то, о чем поговорим позже. Это должно быть сделано автоматически (поэтому никакой генерации скрипта через SSMS и т.д.). Мне уже приходилось начинать все сначала пару раз, потому что каждый раз я сталкивался с проблемами из-за того, что я не продумал, поэтому на этот раз я хотел попросить у вас совета, ребята, прежде чем начинать все сначала.
Мой текущий план действий таков:
- Скопируйте схему из базы данных 1 (позже я добавлю сюда несколько проверок на случай, если схема отличается
- Выполните цикл по всем таблицам и установите для всех обновлений внешнего ключа каскадный режим, а также задайте порядок, в котором необходимо вставлять tabledata (таким образом, сначала таблицы, содержащие PK, затем таблицы, содержащие FK)
-
Зациклите каждую таблицу в правильном порядке
- Проверьте в таблице базы данных 2 столбец идентификаторов, если это так, извлеките текущее начальное значение из соответствующей таблицы в базе данных 1, удалите свойство identity в таблице базы данных 2 и обновите каждый идентификатор до newID = currentId начальный (чтобы избежать дублирования первичных ключей позже)
- Сгенерируйте скрипт вставки (таблица SMO.EnumScript) для таблицы базы данных 1
- Сгенерируйте скрипт вставки (таблица SMO.EnumScript) для таблицы database 2
- Выполните каждую строку в базе данных 1. вставьте скрипт в новую базу данных
- Выполните каждую строку в базе данных 2. вставьте скрипт (который теперь содержит первичные ключи / данные поля идентификаторов, которые будут следовать за данными в базе данных 1) в новую базу данных
-
Перейдите к следующей таблице
При тестировании все работало (отключив свойство identity в SSMS, создал скрипт T-SQL для обновления каждой строки с заданным исходным кодом, ..) Но проблема сейчас заключается в автоматизации этого в C #, более конкретно, в отключении свойства identity. Похоже, для этого нет чистого решения. Создание новой таблицы и перестройка всех ограничений и т.д. Кажется неправильным способом, потому что единственная причина, по которой мне это нужно, — каскадировать каждый FK, чтобы все по-прежнему указывало на правильное место..
Другим способом было бы отложить обновление данных столбца идентификаторов и изменить его после генерации сценария и перед вставкой в новую базу данных. Но тогда мне нужно было бы знать, какие данные указывают на какие другие данные, пока все по-прежнему в строках (insertscript)?
Есть предложения, мысли или методы о том, как справиться с этим?
Я знаю о SQL compare от Red Gate, и это действительно замечательно, но мне нужно запрограммировать это самостоятельно.
Использование: SMO, SQL Server 2005 — 2008R2 (на клиентских серверах нет developers или enterprise edition), ADO.NET , C #, .NET framework 2.0, Visual Studio 2008
Комментарии:
1. Чтобы связать строки без идентификаторов, вы можете использовать идентификаторы GUID в качестве неключевых столбцов.
2. Я написал ETL, чтобы сделать в основном это, не удаляя свойство IDENTITY. Я добавил фиктивный столбец для отслеживания старых идентификаторов и вставил их в карту, а затем я обновил все FK с карты. Короче говоря, у меня была одна проблема, с которой, как я вижу, вы здесь не справляетесь, — это циклические ссылки.
Ответ №1:
Я не уверен, чего именно вы пытаетесь достичь в своем процессе здесь, но управление версиями баз данных — это то, что меня очень интересует.
Взгляните на DBSourceTools ( http://dbsourcetools.codeplex.com ).
Это утилита для записи всей базы данных на диск, включая все ограничения внешнего ключа и данные.
Используя цели развертывания, вы сможете повторно создать эти базы данных на другом сервере баз данных (обычно на локальном компьютере).
Инструмент будет обрабатывать зависимости и большие таблицы базы данных с использованием Sql Bulk insert — попытка сгенерировать скрипт с 50 000 операторами insert будет кошмаром.
Получайте удовольствие.
Отказ от ответственности: Я участвую в http://dbsourcetools.codeplex.com проект.