Як можна порівняти схему двох баз даних?


19

Чи є спосіб знайти відмінності у двох базах даних SQL Server (лише схема). Одне місцеве, а друге - на сайті замовника. У нас виникають проблеми з кристалічними звітами, які виконують деякі звіти, а якийсь код не виконується, і, здається, схеми не відповідають.

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


Це питання щодо SO має кілька хороших пропозицій.
LowlyDBA

Відповіді:


13

Якщо ви не можете використовувати один із багатьох інструментів там із-за проблем із підключенням і хочете порівняти "офлайн", ви можете використовувати SSMS для створення скриптів для всіх об'єктів бази даних, клацнувши правою кнопкою миші на базі даних та за допомогою "Завдання ... / Створити" Сценарії ", і переконайтеся, що ви вибрали для створення одного файлу на об'єкт.

Коли ви зробили це для обох баз даних, отримайте два набори сценаріїв на локальній машині у двох окремих папках і використовуйте WinMerge (або подібне) для порівняння двох.


6

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


6

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

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 

Ви можете подивитися цю статтю або цей зразок коду.


1

Здійсніть пошук "Порівняння SQL Server", і ви знайдете безліч інструментів. Ми використовуємо на своїй роботі Red Gate SQLCompare . Він має 14-денний пробний процес. Але оскільки ви говорите про два різних середовища, я не думаю, що це може працювати для вас, якщо клієнт не надішле вам резервну копію своєї БД. Інший варіант - написати запити до системних таблиць (наприклад, sys.indexes, sys.tables тощо).


SQL Compare працює чудово, якщо у вас є вхід на обидва сервери. Ви можете використовувати інший логін для кожної БД, щоб клієнт повинен був забезпечити вам доступ.
Марк Сінкінсон

1

Найпростіший спосіб - використовувати автоматизований інструмент, побудований для цієї мети , але якщо у вас немає доступу до нього, ви можете отримати всю основну інформацію, яка вам потрібна, з INFORMATION_SCHEMAпереглядів.

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

Напишіть запит (або запити), щоб отримати інформацію, яка має значення для вашого коду, з INFORMATION_SCHEMAпредставлень і запустити його на кожному SQL-сервері з 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. Ви повинні відфільтрувати звернення за датою / часом у коментарях, але в іншому випадку це чудове порівняння двох баз даних.

Престо! Писати це було значно важче, ніж робити фактичне порівняння.


0

Чудовий інструмент, який я використовую (хоча деякий час не оновлюється) - це AdeptSqlDiff

Чи порівнюються обидві схеми, а також порівняння даних. Як і RedGate, це вартість, але також 30-денний пробний термін. І ціна цілком розумна.


0

Можливо, цей безкоштовний сценарій https://github.com/dlevsha/compalex може вам допомогти. Він підтримує Microsoft SQL Server.

Compalex - це безкоштовний легкий сценарій для порівняння двох схем бази даних. Він підтримує MySQL, MS SQL Server та PostgreSQL.

Ви можете спробувати демонстрацію тут

http://demo.compalex.net/


0

Існує багато інструментів сторонніх виробників, які дозволять робити схеми та порівняння даних та синхронізацію. Два інструменти, якими ви можете скористатися, - це ті, які я розробила моя команда, і xSQL Schema Compare для порівняння схем та xSQL Data Порівняння для порівняння даних між об'єктами з однаковою схемою. Сподіваюся, це допомагає!
Відмова: Я приєднався до xSQL


0

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


0

Я фанат SQL DBDiff , який є інструментом з відкритим кодом, який ви можете використовувати для порівняння таблиць, поглядів, функцій, користувачів тощо двох екземплярів баз даних SQL Server та створення сценарію змін між джерелами та цільовими базами даних.


0

Я створив утиліту MssqlMerge , яка дозволяє порівнювати бази даних MSSQL, як структури, так і дані. Доступна безкоштовна версія, яка дозволяє порівнювати визначення таблиць, подання, збережені процедури та функції. Крім того, існує версія Pro, яка підтримує більше типів об'єктів і має функцію 'Результат запиту різниться', де ви можете запускати та порівнювати будь-які результати запитів, включаючи запити проти системних представлень, для порівняння деяких інших деталей, недоступних поза полем.


-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

DBDiff - найкращий інструмент для цього, ви можете знайти його тут .


Ласкаво просимо до адміністраторів баз даних! Як бачите, всі добре отримані відповіді тут - це більше, ніж просто посилання . Подумайте про редагування своєї відповіді та додайте більше інформації про програмне забезпечення, особливо про те, як воно відповідає вимогам у цьому питанні.
Глорфіндель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.