Можливості різноманітних фриварних Compare SQL-Database tools.
На цієї сторінці я трохи порівняю можливостей лише засобів роботи з MS SQL. Зрозуміло, що це дуже обмежена задачка, але замовники на програми у моєму середовище використовують переважно MS SQL. З іншого боку, порівняння схем бази даних (що постійно змінюється у активних проєктах) - це найбільш поширена задачка. Але не єдина. Це більш важлива задачка - зачекати поточний стан SQL-бази у SVN або GIT та пов'язати цей снапшот структури з версію коду. Ця найважлива задачка погано вирішується інструментами, що перераховані нище, це зазвичай платний функціонал всіх тих самих інструментів, що безкоштовно дозволяють лише порівняти схеми SQL. Але якось це можливо вирішити й нищеперерахованими інструментами - розвантаживши скріпт SQL-структури у текстовому вигляді і зачекавши його у SVN або GIT у той самий чек, що й код.
Це порівняння я надам на прикладі одного свого проєкту My project for refactoring huge database to prepare using it in Entity Framework з величезної базою даних з тисячами таблиць і вьюх, з десятком складних SQL CLR Assemlies, брокером та ще чорт зна що було в тієї базі. Спочатку база була зроблена з GUID-ключами які не були визначені як Primary Key у базі. Але такі бази неможливо використовувати у сучасному середовище .NET-програм - Entity Framework, яке вимагає первинний ключ у кожній табличці і надійно працює з простими Identity-ключами. Це була мета цього рефакторінгу і це зараз одна з найпоширеніших задач у інтернеті для програмістів. Задача було дуже складна і мені необхідно було кожний крок дуже уважно контролювати - як саме змінюється SQL-структура . Тоді і перепробував усі ці інструменти, зробив ці скріни та помітив для себе потужні та слабкі сторони кожного.
На скрині нище ви можете побачити структуру цієї бази - кожна невеличка плямочка - це окрема табла, складно пов'язана з іншими. Це скрін зроблено з інструментів VS2015 для роботи з Entity Framework.
До речі, у Мікрософта існує два конкуруючих інструмента для роботи з базами. Перший - це Visual Studio. Він працює дуже повільно і не подобається мені цим. Цим інструментом можно працювати з середовища самоє програми, тобто з моделью Entity Framework або з моделью Linq-to-SQL (або навіть зі старою моделью Typed Data Set - я взагалі почав робити порівняння зручності цих моделей ось тут Класифікація засобів роботи з даними., але нажаль не вистачає часу закінчити порівняння можливостей ціх підходів). Так ось, перший засіб працювати з базами - це користуватися безпосередньо моделями даних inside a VB.NET projects, як це ви бачите на скрині вище.
Альтернативний засіб працювати з даними, це працювати у тій ж самій VS 2015, але без VB.NET - лише у Server Explorer's, який зараз називаеься SSDT tools, цей засіб ви маєте можливість побачити нище.
Повністю альтернативний мікрософтовский інструмент MS SMS. Він працює, мабуть у тисячі разів швидче, ніж Visual Studio і тим мені подобається. Але він не вміє шукати сучасні точки конекту до LocalDB (обмежена SQL-версія без імперсоналізації) та має багато інших обмежень. Але якщо він дозволяє робити те, що вам необхідно - немає ніякого сенсу використовувати VS2015, яка працює занадто повільно. Якщо ви подивитесь відео моєї реальної роботи (лінк вище), то побачите що я переважно використовую саме MS SMS
Ще одна заморочка, що у Мікрософта існує декілька несумісних одне з одним версій MS SMS. Новітній мікрософтовский двигун SQL 2016 займає мабуть 1% від усіх існуючих MS SQL баз, на мій погляд, процентів 90 мікрософтовских баз зроблено на двигуні 2008, для якого існує інша версія MS SMS, яка працює ще швидче. Зрозуміло, що існують ще старі версії Visual Studio, але як я вже казав, для будь яких версій SQL вони працюють у тисячу разів повільніше і мають сенс лише для окремих задач, які неможливо виконати у MS SMS.
Отже, сподіваюсь ви зрозуміли різницю двох головних мікрософтовских інструментів для роботи з MS SQL. І тепер підемо далі. Нажаль жоден з мікрософтовских інструментів не задовольняє практичним потребам - порівняти схеми баз і зачекати SQL-схему в один чек з версією VB-кода, який рпацює саме з цією конкретною схемою. MS SMS навіть взагалі порівнювати схеми не вміє. Жах якийсь, для кого все це зроблено?
Едине що є у мікрософта своє - дуже непоганий порінювач SQL-структури, вбудований у VS2015. Він дуже повільний, але він мені подобається. Якби в ньому ще додати кнопку - зачекати структуру базу в GIT чи SVN, та реальне порівняння зачеканих структур у GIT/SVN - цьому порінювачу SQL-структур би цени не було. Але нажаль маємо, що маємо. Порівнювачу SQL-структур, вбудованому у SSDT я ставлю найвищу з можливих оцінок. Якби він ще працював хоча б разів у 10 швидче та міг би чекати SQL-структури...
Але, як я казав, студію працює занадто повільно - цю задачу, яку я виконав на відео у MS SMS за 2-3 години, я у студії МІ2015 виконував би місяць, алу нажаль MS SMS взагалі немає ніякого порівнювача SQL-структур. І тут нам допоможе https://www.apexsql.com/.
У Апекса багато інструментів, та навіть у SQL-compare tool майже всі можливості повністю безглузді.
Наприклад автономний порівнювач Апекса
працює ще гірше, ніж звичайний вбудований у віндузню WinDiff.
Але одна з можливостей порівнювача Апекса, а саме порівняння, вбудоване у MS SMS - заслуговує найвищой з можливих оцінок і мені дуже подобається.
Взагалі, якщо ви щось шукаєте для порівняння, то сказаного вже вистачить, щоб працювати. Але ми підемо далі.
Поперше головні необхідні інстпументи, як я вже казав - це чек SQL-структури в той же самий чек, що й код, який використовує саме цю версію SQL-структури.
Але щоб порівнювати структури, зачекани у GIT, є невеличка хитрість. Треба ручками зробити файлік .gitattributes
Після цього порівняння зробити принципово можливо.
Але воно працює неможливо погано, ним на практиці користуватися зовсім неможливо. Нажаль спеціфічного плагіна для GIT та SVN я так і не знайшов за усі роки роботи з ціми інструментами. Якщо ви знаєте такі плагіни, напішить мені їх будь ласка у каментах.
Але давайте підемо трохи далі, бо існує ще декілька інструментів. Перший з них http://sqltools.a7.plus/. A7 SQL comparer якось нагадує можливості порівнбвача VS2015 і якщо ви добре розумієте свою структуру і пам'ятатє яки зміни ви вносили з версії до версії коду, то дуже просто в один клік привести існуючу структуру бази до необхідної до поточної версії коду.
І останній фріварний інструмент, який ми тут згадаємо - це http://dbcomparer.com/. Цікавий та популярний інструмент. Працювати ним мені не так подобається як наприклад порівнювачем Апекса для MS SMS або порівнювачем SSDT (вбудованим у студію), або компарером S7 (коли потрібно щось швидко привести в поточній базі до якогось старого стану) - але взагалі його можна використовувати як додатковий контрольний інструмент для візуального контролю зробленої роботи, він дуже непогано показує всі об'єкти бази. Його можна використовувати як "контрольний постріл" після роботи з більш спеціфічних та швидких інструментах. Наприклад, швидко пробігтися глазками по об'єктам баз та порівняти індекси, ключи, трігери, юзерів, кріптографічні ключи, або сборки. Нажаль цей інструмент часто аварійно падає, і потім довго-жовго потрібно знову закачувати в нього структури для порівняння.
Саме тому, що всі ці інтрументи не ідеальні, я з давних часів пишу собі власні компарери SQL-структур. Ось один з таких моїх проєктів, мабуть не гірше цього DB-comparer'а від 2005-го року - Альтернативная оболочка к SQL2005, написаний мною ще 12 років тому!
Робив я його тому, що 12-років тому не існувало взагалі компареров, які б вигружали справочники та порінюювали не тільки SQL-структуру, але й безпосередньо дані у таблах. Бо ці дані (особливо у справочніках) завжди пов'язані в версіями коду. Наприклад якась версія коду працює лише с ключами 1 та 2, що наприклад означаю прийом грошей зі шлюзом Пейпала та Скріл, а інша версія коду працює також зі шлюзом Піонєр, що означає код 3 в якомусь справочнику. І який сенс зберігати лише структуру бази без даних без безпосередньо даних. Все одно "не своя" версія коду не буде працювати з "чужою" базою, а база буде чужою лише від того, що в якому справочнику присутній або відсутній ключ 3 - навіть при однаковій структурі!
З інструментів, які перераховані вище, лише SSDT Tools з VS2015 розуміє необхідніть вигрузки та порівняння справочників, але це самий повільний з можливих інструментів, і задовольняє реальним потребам програмістів лише трохи-трохи, тобто без чека коду у сістему контроля версій, а тем більше без можливостей порівняння даних у справочниках. Інші перераховані інструменти взагалі нічого про порівняння даних у справочниках ніколи не чули. Тому я й писав свої власні інструменти.