Я имею table a
и table b
. (SQL Server 2008)
Обе таблицы имеют ту же самую схему.
В целях этого вопроса рассмотреть table a
= моя локальная dev таблица, table b
= живая таблица.
Я должен создать сценарий SQL (содержащий UPDATE/DELETE/INSERT
операторы), который обновит таблицу b для совпадения с таблицей a. Этот сценарий будет затем развернут на живой базе данных.
Какие-либо бесплатные инструменты там, которые могут сделать это или еще лучше способ, которым я могу сделать это сам?
Я думаю, что, вероятно, должен сделать некоторый тип соединения на всех полях в таблицах, затем генерировать динамический SQL на основе этого.
У кого-либо есть какие-либо идеи?
Править
Хорошо, мысль я разъяснил бы этот вопрос немного.
Таблица, которую я должен синхронизировать, является простой справочной таблицей. Данные очень просты и просты.
Вот идея какой TABLE A
мог бы быть похожим:
IdFoo Activity IsFoo
1 Foo 1
2 Bar 0
Вот идея какой TABLE B
мог бы быть похожим:
IdFoo Activity IsFoo
1 Foo 1
2 Bar 1
В основном все, что я хочу сделать, обновить это BIT
столбец (IsFoo
) в TABLE B
соответствовать соответствующему значению в TABLE A
для того же IdFoo.
Следует иметь в виду:
TABLE A
находится на моей локальной машинеTABLE B
находится на живом сервереОчевидно, у меня есть (надежное) резервное копирование TABLE B
на моя локальная машина, которой я должен написать сценарий против, затем запустите скрипт на живом сервере.
Таблица также имеет ссылочную целостность (другие столбцы, которые я не показал). Что означает, что я не могу просто удалить все в TABLE B
и сделайте вставку от TABLE A
.
Этот сценарий будет однажды прочь. Так никакая потребность сделать вещи как связанный сервер, репликация, и т.д. Цените ответы хотя парни.=)
Править:
Хорошо - таким образом, я пошел с ответом Oleg (Данные VS2010 Выдерживают сравнение). Быстрый, легкий, и работы очарование.
Для не высказывания других ответов являются неправильными. Я ценю все ответы!
В очень простых случаях вы сможете определить в своем локальном SQL Server новый связанный сервер (см. В Microsoft SQL Server Management Studio в разделе «Объекты сервера» / «Связанный сервер») и использовать INNER JOIN
и OUTER JOIN
, чтобы найти различия между таблицами A и B.
В реальной и более сложной ситуации вы должны принимать во внимание ссылочную целостность, различные внешние ключи и поля идентификации (автоматически добавляемые), существующие в целевой базе данных, поэтому сценарий обновления будет более сложным. Поэтому я рекомендую вам не тратить время на синхронизацию своей базы данных разработчика и производственной базы данных и использовать вместо этого стандартный инструмент. Я использую, например, функции Visual Studio Team Edition 2008 (или Database edition) или Visual Studio 2010 Ultimate edition для сравнения данных в двух базах данных. Работает очень хорошо.
Если вы просто хотите синхронизировать таблицы и не заботитесь о предварительном просмотре изменений, команда MERGE может это сделать.
(бесплатный) Microsoft SSDT также имеет встроенные средства сравнения и синхронизации данных, хотя он более ограничен, чем платные инструменты, такие как сравнение данных Redgate.
Есть SQL Data Compare от RedGate (хотя и не бесплатный), а также SMO и встроенные функции.
Наконец, Wikipedia имеет довольно полный список программного обеспечения.
Поскольку это один раз, вы можете использовать этот запрос для поиска строк, которые отличаются в этих двух таблицах:
(SELECT * FROM TABLE_A
MINUS
SELECT * FROM TABLE_B)
UNION ALL
(SELECT * FROM TABLE_B
MINUS
SELECT * FROM TABLE_A)
MINUS
будет сравнивать записи поле за полем, затем он отбросит записи из первой таблицы, для которой есть Идентична запись во второй таблице. Это работает следующим образом:
MINUS
получает все записи из TABLE_A
, которых нет в TABLE_B
MINUS
получает все записи из TABLE_B
, которых нет в TABLE_A
Теперь вы можете вставить эти записи в какую-нибудь временную таблицу, а затем выполнить вставку / обновление.
В зависимости от ваших потребностей вы можете ограничить список полей для сравнения.
Обратите внимание, что для работы необходим первичный ключ.
Редактировать:
Упс. SQL Server не поддерживает оператор MINUS
. Я работал с ORACLE последние полтора года, так что это было автоматически.
Вместо этого можно использовать оператор EXCEPT
. См. Эту статью: EXCEPT и INTERSECT (Transact-SQL)
Edit 2:
Re комментарий Scherand :
Если он действительно не может подключиться с локальной машины к живому серверу, он может просто выгрузить TABLE_A
и загрузить его на сервер. Так или иначе, цель - изменить данные таблицы на живом сервере.
Вы можете использовать генератор сценариев данных, который создает сценарий для вставок, а затем использовать инструменты сравнения файлов, такие как WinMerge, для сравнения файлов и поиска различий. Есть статья о создании скриптов данных в проекте кода: http://www.codeproject.com/KB/database/sqlinsertupdategenerator.aspx
Вы также можете попробовать использовать данные импорта и экспорта
, предоставляемые SQL Server 2008. Это довольно простой способ скопировать все данные из любого места в любое место. Я делаю то же самое и отлично работает.