Как я могу сравнить схему двух баз данных?

19

Есть ли способ найти различия в двух базах данных SQL Server (только схема). Один из них локальный, а второй на сайте клиента. У нас возникают проблемы с кристальными отчетами, в которых запущены некоторые отчеты, а часть кода не выполняется, и может показаться, что схемы не совпадают.

Можно ли выполнить одну и ту же команду в обеих базах данных и сравнить результаты, чтобы определить различия?

user1571430
источник
Этот вопрос о SO имеет несколько хороших предложений.
LowlyDBA

Ответы:

13

Если вы не можете использовать один из множества инструментов из-за проблем с подключением и хотите выполнить «автономное» сравнение, вы можете использовать SSMS для генерации сценариев для всех объектов базы данных, щелкнув правой кнопкой мыши базу данных и используя «Задачи ... / Создать» Scripts ", и убедитесь, что вы выбрали создание одного файла для каждого объекта.

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

Мистер магу
источник
6

Другой вариант - использовать инструменты данных SQL Server (SSDT), расширение Visual Studio. Вы можете извлечь схему базы данных в виде файла .dacpac и сравнить ее с другим файлом .dacpac или существующей базой данных. SSDT включен в клиентские инструменты SQL Server 2012, что делает его довольно доступным. Вы можете найти полные инструкции о том, как выполнить сравнение на сайте MSDN .

Майк Фал
источник
6

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

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go
Джон Адамс
источник
Для быстрого и грязного решения, которое не требует дополнительного программного обеспечения, это здорово! Это именно то, что мне было нужно. Благодарность!
Мир,
2

Если вам нужно сравнить несколько файлов базы данных, вы можете написать скрипт SQLPackage.exe.

У меня нет рабочего кода для вас, но вы можете найти документацию по SQLPackage.exe для вдохновения.

Вы должны извлечь вашу основную базу данных в файл dacpac, а затем сравнить файл dacpac с остальными базами данных. Результатом сравнения может быть отчет об изменениях в формате xml или файл .sql, который можно запустить для синхронизации баз данных.

Что-то вроде этого:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

а потом

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

Вы можете взглянуть на эту статью или эту для примера кода.

Том V - Команда Моника
источник
1

Выполните поиск «Сравнение SQL Server», и вы найдете множество инструментов. На моей работе мы используем Red Gate SQLCompare . Он имеет 14-дневную пробную версию. Но поскольку вы говорите о двух разных средах, я не думаю, что это сработает для вас, если только клиент не отправит вам резервную копию своей БД. Другой вариант - писать запросы к системным таблицам (таким как sys.indexes, sys.tables и т. Д.).

Крис Вудс
источник
SQL Compare отлично работает, если у вас есть логины на обоих серверах. Вы можете использовать разные регистрационные данные для каждой БД, поэтому клиент должен убедиться, что у вас есть доступ.
Марк Синкинсон
1

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

Использование метаданных в INFORMATION_SCHEMA, вероятно, является более простым вариантом, чем генерация сценариев DDL и сравнение источников, потому что у вас гораздо больше контроля над представлением данных. Вы не можете реально контролировать порядок, в котором сгенерированные скрипты будут представлять объекты в базе данных. Кроме того, сценарии содержат набор текста, который по умолчанию может зависеть от реализации и может вызывать много "несоответствующих" шумов, когда вам, вероятно, действительно необходимо сосредоточиться на отсутствующей таблице, представлении или столбце или, возможно, типе данных столбца. или несоответствие размера.

Напишите запрос (или запросы), чтобы получить информацию, имеющую значение для вашего кода, из INFORMATION_SCHEMAпредставлений и запустить ее на каждом SQL Server из SSMS. Затем вы можете либо выгрузить результаты в файл и использовать инструмент сравнения текстовых файлов (даже MS Word), либо вы можете вывести результаты в таблицы и выполнить запросы SQL, чтобы найти несоответствия.

Джоэл Браун
источник
1

Я включил этот ответ ради нового вопроса, который был отмечен как дубликат.

Мне когда-то приходилось сравнивать две производственные базы данных и находить какие-либо различия между ними. Единственными интересующими элементами были таблицы, которые были добавлены или удалены, и столбцы, которые были добавлены, удалены или изменены. У меня больше нет сценариев SQL, которые я разработал, но ниже приводится общая стратегия. И база данных не была SQL Server, но я думаю, что применяется та же стратегия.

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

Затем я разработал сценарии, которые связывают выборки из системных таблиц производственных баз данных со вставками в пользовательские таблицы базы метаданных.

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

Из примерно 100 таблиц и 600 столбцов я обнаружил несколько несоответствий и один столбец, который был определен как плавающая точка в одной базе данных и целое число в другой. Этот последний оказался находкой, потому что он обнаружил проблему, которая преследовала одну из баз данных в течение многих лет.

Модель для базы метаданных была предложена системными таблицами. Запросы составить несложно, они вращаются в основном вокруг группы и имеют количество (имя базы данных) = 1.

В вашем случае, с 700 производственными базами данных, вы можете захотеть автоматизировать первые два шага больше, чем я, просто сравнив две базы данных. Но идея похожа.

Уолтер Митти
источник
1

У меня был точно такой же вопрос, и я считаю, что Microsoft SQL Server Management Studio (SSMS) имеет гораздо более простое / простое решение, чем все, что я видел здесь. У меня есть производственный сайт с MS SQL Server Express, и скоро я буду еще на нескольких, где мне не нужно устанавливать VisualStudio или другие приложения, кроме SSMS.

В рамках SSMS щелкните правой кнопкой мыши базу данных, чтобы получить схему для. Выберите Задачи> Создать сценарии ..., чтобы открыть мастер для создания сценария схемы и конфигурации для всей базы данных (или выбранных объектов, если хотите). Я сохранил все параметры по умолчанию, кроме пути / имени файла, но у инструмента есть множество параметров. Мастер создал один SQL, который я скопировал через OneDrive обратно на мой компьютер. Затем я использовал Notepad ++ для сравнения SQL с файлом, сгенерированным таким же образом, с моей базой данных SIT. Вы должны отфильтровать совпадения по дате / времени в комментариях, но в остальном это отличное сравнение двух баз данных.

Presto! Записать это было значительно сложнее, чем сделать реальное сравнение.

RBrown
источник
0

AdeptSqlDiff - отличный инструмент, который я использую (хотя некоторое время не обновлялся, пока работает)

Обе схемы сравнивает, а также сравнения данных. Так же, как и у RedGate, есть и стоимость, и 30-дневная пробная версия. И цена довольно разумная.

TombMedia
источник
0

Возможно, вам поможет этот бесплатный скрипт https://github.com/dlevsha/compalex . Это поддерживает Microsoft SQL Server.

Compalex - это бесплатный легкий скрипт для сравнения двух схем баз данных. Он поддерживает MySQL, MS SQL Server и PostgreSQL.

Вы можете попробовать демо здесь

http://demo.compalex.net/

DLevsha
источник
0

Существует множество сторонних инструментов, которые будут выполнять сравнение схем и данных, а также синхронизацию. Моя команда и разработчики разработали два инструмента: xSQL Schema Compare для сравнения схем и xSQL Data Compare для сравнения данных между объектами с одной и той же схемой. Надеюсь это поможет!
Отказ от ответственности: я связан с xSQL

Энди Жупани
источник
0

На рынке есть много инструментов, которые вы можете использовать для выполнения работы. Моя компания использует ApexSQL Diff как для сравнения, так и для синхронизации, потому что она бесплатна для Azure, но вы не ошибетесь с инструментами Devart или Redgate.

Mspaja
источник
0

Я фанат SQL DBDiff , который является инструментом с открытым исходным кодом, который можно использовать для сравнения таблиц, представлений, функций, пользователей и т. Д. Двух экземпляров баз данных SQL Server и создания сценария изменений между исходной и целевой базами данных.

Шридхар
источник
0

Я создал утилиту MssqlMerge, которая позволяет сравнивать базы данных MSSQL, как по структуре, так и по данным. Доступна бесплатная версия, которая позволяет сравнивать определения таблиц, представления, хранимые процедуры и функции. Кроме того, есть версия Pro, которая поддерживает больше типов объектов и имеет функцию «Запрос результатов сравнения», где вы можете запускать и сравнивать любые результаты запросов, в том числе запросы с системными представлениями, для сравнения некоторых других деталей, недоступных сразу после установки.

Sarh
источник
-1

Проверь это:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

введите описание изображения здесь

Джереми Томпсон
источник
3
Это действительно нужно сравнивать, а не просто получать схему
Марк Синкинсон
Я просто оставлю это здесь, если это поможет другим. Это помогло мне
Джереми Томпсон
-1

Я использую этот бесплатный (и с открытым исходным кодом) инструмент: OpenDBDiff

Томми
источник
-1

DBDiff - лучший инструмент для этого, вы можете найти его здесь .

levisaligue
источник
Добро пожаловать в Администраторы базы данных! Как видите, все хорошо принятые ответы здесь - это больше, чем просто ссылка . Пожалуйста, отредактируйте свой ответ и добавьте больше информации о программном обеспечении, особенно о том, насколько оно соответствует требованиям, указанным в вопросе.
Глорфиндель