А вы тоже ищете зависимости в SQL вручную? Тогда мы идем к вам! SQL Dynamite, поиск по объектам базы

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

    Какую задачу решаем?


    Нахождение зависимостей объектов в БД.
    Поиск по строке в метаданных БД (хранимых процедурах, View, пользовательских функциях, определениях таблиц, индексах, ключах)



    Откуда взялась идея


    Мы с коллегой (fire_lizard) столкнулись с громадной базой данных, тысячи процедур, таблиц, функций и прочих полезностей. Необходим был рефакторинг, плюс новый функционал. С документацией по базе, все было не ахти, и нам пришлось разбирается co схемой базы самостоятельно. Это был сущий ад.
    На второй неделе мы поняли, что нахрапом бастион не взять.
    Вспоминая свое славное Юниксовое прошлое, я начал немного скучать по утилите grep, и мы решили, что нам нужно такое же, но «без крыльев» для SQL метаданных.

    Сказано – сделано.


    Первая версия была написана за неделю и слава о ней разлетелась по всему отделу разработки. Она была заточена под MS SQL и работала из командной строки.
    Вдохновившись откликом от коллег, мы немного причесали утилиту, пририсовали ей UI, сделали подсветку вхождений и подсветку синтаксиса. Назвали SQL Dynamite (только не спрашивайте почему динамит, так получилось ;-)
    Затем народ нас стал спрашивать про поддержку других баз. Как в любой уважающей себя крупной организации, у нас был целый зоопарк различных БД. Следуя пожеланиям трудящихся, и собственному живому интересу к SQL, мы понемногу разобрались со структурой схем разных баз.
    Да еще в процессе разработки стало интересно пощупать .NET на предмет кроссплатформенности. Оказалось, все неплохо. Слегка поработав напильником, сделали проект под Mono, и программа заработала под теплым ламповым Linux-ом и Mac OS X.

    Возможности


    • Поиск вхождений в имени или тексте хранимых процедур, функций, триггеров, таблиц и индексов, ключей;
    • Поиск с использованием шаблонов (синтаксис LIKE %,_);
    • Задание объектов для поиска;
    • Отображение тела найденных объекта в виде DDL;
    • Подсветка синтаксиса;
    • Подсветка найденной строки в теле объекта;
    • Хранение истории поиска;
    • Работа с несколькими базами.

    Поддерживаемые DB


    • MS SQL;
    • MySql;
    • Oracle;
    • SQL Azure;
    • Sybase ASE;
    • Sybase Anywhere;
    • Ingress;
    • PostgreSQL;
    • IBM DB/2;
    • Firebird.

    Планы


    • Добавить сохранение DDL по найденным объектам в файл
    • Добавить рюшечки в UI
    • Сделать поиск сразу по нескольким базам
    • Показ найденных объектов в виде дерева с группировкой по типу объекта
    • Редактирование найденных объектов
    • Автозамена

    Где взять?


    Последняя версия лежит здесь. Пользуйтесь на здоровье.

    Будем рады любому фидбеку в виде комментариев, критики и багрепортов и добавления новых фич.
    PS: Если интересно, то можем написать статью по поводу работы с метаинформацией в разных базах данных.
    ХостТрекер
    70,00
    Сервис мониторинга доступности сайтов
    Поделиться публикацией

    Комментарии 55

      +3
      Вещь очень полезная!
        0
        Спасибо!
        0
        Чувствую скоро пригодится. Утянул. :)
          0
          Укажите пожалуйста тип лицензии,
          ну и насущный вопрос): на сорци взлянуть можно будет?
            0
            Лицензия свободная/бесплатная без ограничений. Что делать с сорцами пока думаем.
              –2
              Free как пиво, или free как слово? :)
            0
            Думаю пригодится. Спасибо.
              0
              Мне вот очень нравится, как подобный функционал реализован в dbForge для работы с MySQL, частно им пользуюсь. Так что можете посмотреть для сравнения.
              В вашей же программе радует количество поддерживаемых БД, довольно универсально получилось.
                0
                Дбфорг посмотрим, спасибо
                0
                Не совсем понял как запустить это под OS X и linux… можно ман выложить?
                  0
                  Нужно скачать и установить Mono

                  www.go-mono.com/mono-downloads/download.html

                  потом скачать zip архив для Linux & Mac OS X и запустить командой

                  mono SqlDynamiteX.exe
                    0
                    Пробовал запустить, в итоге куча ошибок и ничего не работает. Отпишитесь, кто еще пробовал и у вас получилось?
                      0
                      А можно лог ошибок сюда кинуть?
                  0
                  В Ms Sql поиск зависимостей, скажем, в хранимках, осуществляется по системной таблице syscomments?
                  Или есть другие механизмы отслеживания зависимостей?
                    0
                    Кроме syscomments используется ещё куча системных таблиц и системных же хранимых процедур
                      0
                      Да, в курсе. Имел в виду может есть какие-то другие инструменты получения схемы… Что-то типа «волшебного»:) xml-файла или утилиты в самом же MS Sql, которая позволяет получить схему данных.
                        0
                        Волшебного нету :-), а про то что есть попробуем написать в следующей статье
                    0
                    MySQL — невозможно загрузить файл или сборку «MySql.Data, Version 6.2.2.0, Culture=neutral, PublicKeyToken=bla-bla-bla» или один из зависимых от них компонентов. Не удается найти указанный файл.
                    ЧЯДНТ?
                    Windows 7 Pro SP1 х64, обновления все стоят.
                      0
                      Для баз отличных от MSSQL, SQL Azure и Oracle нужны свои ADO .NET драйвера

                      Вот для MySQL например:

                      dev.mysql.com/downloads/connector/net/6.8.html
                        0
                        Скачал, поставил, результат тот же!
                          0
                          Ну что ж тогда вот dllки эти попробуйте подложить и отпишитесь пожалуйста как и что

                          depositfiles.com/files/vhtim8jc9
                            0
                            Заработало, только вместо названий БД в селекте поля def, def, def, def (по кол-ву БД на сервере).
                              0
                              А вот это уже баг программы. Буду исправлять.
                                0
                                Дополнение: Если вписать название БД вручную, то все равно вытягивает зависимости для таблиц из всех БД, в том числе и системных.
                    0
                    Если база данных в названии содержит пробелы(знаю что это не хорошо но законно :) ) при попытке соединится пишет: Database 'первая часть до пробела из названия' does not exists. Make sure that name is entered correctly.
                      0
                      Понял, этим займёмся.
                        0
                        Баг исправлен новый билд здесь:

                        rghost.ru/52013822
                      0
                      Для MSSQL пользуюсь ApexSQL Search.
                      Так же от них есть еще пара полезных утилит, особенно хорош ApexSQL Complete.
                        0
                        Велосипедично!

                        Нет, мы ищем при помощи Google, и находим
                        www.red-gate.com/products/sql-development/sql-search/
                        Упомянутый Apex SQL Search
                        ssmsaddins.codeplex.com/
                          0
                          1) начнем с того что первая версия была написана во времена когда редгейтовской тулзы не было. Про апекс не скажу,
                          2) вы список поддерживаемых баз видели?
                            0
                            Со списком поддерживаемых баз, для которых «нужно положить dll'ки», «скачать моно, бесплатно, без SMS» мне сложно поспорить, но, право же, начинать пост рассказом про «славную тулзу ищущую по ms sql», когда для простоты картины достаточно скачать что-то вроде «gallery.technet.microsoft.com/scriptcenter/c0c57332-8624-48c0-b4c3-5b31fe641c58».

                            Честное слово, ждем аналог select * from all_sources для Oracle с обвязкой .Net
                              0
                              1. Mono нужно только для версий под Linux / Mac OS X

                              2. Программа умеет намного больше чем select * from all_sources, а будет уметь ещё больше если Вас послушать так и Apex с RedGate не стоило тоже разрабатывать наверное.
                                0
                                Все, сдаюсь, раз вы так защищаете свое детище, значит оно того стоит. )
                                Пусть будет еще один искатель текста, с поддержкой множества СУБД и поэтессами.
                                  0
                                  Повторюсь, наша программа искатель не только текста — также она ищет и в теле таблиц и индексов — заметьте что их DDL ни в каких таблицах типа all_sources не хранится (не в случае Oracle конечно), и программа ищет также и в них и также сама генерирует поим DDL.
                          +1
                          1) Ещё была бы интересная фича искать в квери логе. У нас например легаси система в базе не прописано ни PK-FK ни ещё чего, 90% инфы о связях получаем из квери лога из запросов с джоинами.

                          Для реализации фичи нужно единожды для поддерживаемой базы узнать из какойсистемной таблицы можно селектом забрать квери лог и прицепить это дополнительным источником данных

                          2) Я бы в список поддерживаемых ещё добавил IBM Informix, она работает с уже поддерживаевым Вами драйвером DB2 и со своим собственным от IBM, оба ADO.NET compatible и в теории ничего пилить не нужно
                            0
                            Пилить как раз нужно — там метаданные по другому устроены чем в IBM DB/2 но сделаем :)
                              0
                              Я глубоко не копал, но мне кажется если обращаться к информиксу через DB2 драйвер (для этого сервер баз должен быть настроен на поддержку соответствующего протокола), то он и метаданные отдаёт в идентичном DB2 формате. Если именно через информиксовский, то наверное Вы правы, придётся пилить.

                              Ещё имхо если возьмёте курс на расширения списка поддерживаемых баз имеет смысл добавить ODBC (для которого тоже есть ADO.NET поддержка). Тут конечно уже все-все метаданные не зная типа базы не получить, но хотя бы список полей таблиц, view и тому подобные базовые вещи работают на всём зоопарке баз.

                              Вообще инструмент получения структуры базы стабильно работающий с минимальными возможностями на широком спектре баз имхо весьма востребован. Мы в своё время покупали очень сырую и нестабильную Database.NET чтобы получить просто инструмент «быстрого взгляда» на произвольную базу. А если Вы планируете развивать продукт не только в сторону поиска связей но и в сторону скажем генератора отчётов по структуре базы или визуализации базы — тут вообще огромное поле, к примеру годами пользователи Nhibernate просят адекватный инструмент автогенерации биндингов по существующей базе
                                0
                                Про ODBC имелось в виду работа с не перечисленными у вас базами, т.е. без обращения к специфичным служебным таблицам, а только за счёт стандартного подмножества ODBC комманд и ANSI SQL. Для экзотичных систем
                                  0
                                  Спасибо за столь содержательный отзыв. Увы, не всё так просто. Программа вытаскивает метаданные не используя ODBC API (вряд ли это вообще возможно), а вытаскиванием метаданных из СУБД которые для каждой СУБД очень даже разные, и конечно же расположение метаданных в СУБД ну никак не зависит от используемого драйвера (то есть в данном случае нет абсолютно никакой разницы обращаться ли к Informix через собственный драйвер или же через драйвер DB/2).
                                    0
                                    Да, я неудачно выразился по поводу метаданных. Имелось в виду что для некой неизвестной базы с ODBC (проприетарная generic odbc ) драйвером можно получить базовый набор таблиц-видов-полей-типов не имея доступа к системным таблицам за счёт повсеместно поддерживаемого подмножества ANSI 92. Не скажу точно какие используются вызовы, если инетерсно гляньте кверилог от Database.NET у них «ОДБЦ кони в вакууме» хорошо реализованы.

                                    И ещё совет — если Вы уже поддерживаете ODBC то лучше вместо выпадающего меню с выбором драйвера оставить текстовое поле для ConnectionString. Для большинства баз всё равно выбора драйвера недостаточно для корректной работы, и люди всё равно используют либо заранее созданные в системе профили типа «DSN=profile_db1_test_root», которые уже содержат выбор драйвера, либо более сложные строки с выбором драйвера, с дополнительными параметрами подключения. Даже если вы спрашиваете например логин и пароль в форме, то для ODBC подключения часто недостаточно передать эти данные параметром login/password, для некоторых баз их надо передавать параметром UID, для многих баз нужно передавать ещё выбор бинарного протокола и кодировок итд. Та же ДБ2 поддерживаемая в зависимости от CLOL/DBLOC настройки не заведётся по одбц одним выбором драйвера. В общем имхо упростите себе и пользователям жизнь если вместо выпадающего меню драйвера будет просто ConnectionString (ну или дополнительно к выбору драйвера, всё равно внутренне вы скорее всего превращаете выбор драйвера в стринг)

                                    Ну это в общем так, слёзы задолбавшегося кодера легаси баз )))) Я догадываюсь что ОДБЦ не приоритетное направление развития, но надеюсь будут полезны замечания
                            +1
                            БД с точкой в названии неверно обрабатывает. К примеру, TIM_4.9 — пишет «база TIM_4 не найдена». DB Server MSSQL
                            +1
                            Спасибо пригодится, а есть утилита для оптимизации 3-4х этажных запросов? Я нашел парочку прог, но они платные, можно сказать не нашел.
                              0
                              Такого пока нет
                              +1
                              поддержка sqlite3 есть в планах?
                                0
                                Будет вместе с Informix ближе к весне
                                0
                                Для PostgreSQL не поддерживается trust-подключение или я что-то не так делаю?
                                Упорно пишут «password authentification failed for 'postgres' „
                                  +1
                                  Попробую воспроизвести и отпишусь
                                    0
                                    Не могу воспрозвести честное слово. И локально и удалённо Trusted Connection у меня работает.
                                  0
                                  При коннекте к базе: не удалось загрузить файл или сборку Npsql Version 2.0.8.0, Culture=neutral либо одну из из зависимостей.
                                  Windows 7 sp1, postgresql 9.2, .NET 4.5.1
                                    0
                                    Забирайте новую версию:

                                    www.host-tracker.com/SqlDynamite

                                    и этой проблемы быть не должно
                                      0
                                      По моему, очень важно искать зависимость программного кода и объектов БД
                                      Посмотрите: ODA
                                      Обозреватель зависимостей объектов БД
                                      www.samtrest.com
                                      Заточен на Oracle,PL/SQL, Informatica, но не только…
                                        0
                                        ссылка на скачивание инсталлера для винды битая

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

                                      Самое читаемое