Недавно поменял работу, на новом месте столкнулся с нечитабельной структурой базы данных MSSQL, в которой таблицы и поля не имеют понятных названий (префикс + число). Например: таблицы называются Data1078, Data2022, а колонки называются f210, f1521. Подобные структуры часто встречаются в коробочных продуктах.
Так как в базе данных реализована логика в виде хранимых процедур, а объектов уже тысячи, переделывать или предлагать новую структуру достаточно сложно. В базе данных в отдельных таблицах уже есть описание всех таблиц и колонок, программисты для получения описания каждый раз вызывают вспомогательные хранимые процедуры, одна процедура для получения описания таблицы show_tab и одна процедура для получения описания поля show_fld.
SELECT
d.f1229,
d.f1230
FROM
dbo.Data1220 d -- show_tab 1220
WHERE
d.f1235 in (1,2) -- Описание магических констант не развито в команде.
Чтобы посмотреть структуру и описание таблицы, разработчики обычно добавляют вспомогательные команды прямо в код и описывают колонки комментариями. Для просмотра описания и структуры таблицы, надо выделить хранимую процедуру show_tab 1220 и выполнить ее, описание таблиц, колонок и тексты джойнов будут выведены в таблице результатов. Помучавшись немного с чтением кода (особенно с колонками), появилась идея написать расширение, которое просто выводит описание по выделенному тексту.
Поскольку в основном код редактировался в ManagmentStudio, а небольшой опыт по написанию расширений для продуктов Microsoft у меня имелся, решил написать небольшое полезное расширение. Покапавшись в GitHub, набрел на расширение для ManagmentStudio, найденное расширение уже содержало часть нужного кода и инструкцию по установке, первоначально удалил лишний код специфичный для расширения и добавил нужный мне. Дальше в базе данных написал хранимую процедуру, которая принимает в качестве параметра выделенный участок текста и выводит одной колонкой полезную информацию.
Расширение по таймеру вызывает хранимку и передает туда выделенный текст, результат из хранимой процедуры выводится в консоль вывода. После демонстрации расширения, часть программистов сразу поставила себе расширение. Дальше разработчики стали генерировать идеи, в первую очередь попросили добавить отдельное окно для просмотра структуры таблиц. Например выделяешь таблицу dbo.Data2078 нажимаешь Alt+S, расширение показывает отдельное окно, в верхней части окна отображается описание таблицы (хранимая сущность) и структура таблицы, в нижней окно с последними записями в таблице и SQL запрос, например такой SELECT TOP 10 * FROM dbo.Data2078 (nolock) ORDER BY id DESC.
В таблице отображается описание полей, тип данных и размерность, информация по ключам, текст джойна (если это ссылочное поле). Ширину и порядок колонок можно настраивать, расширение для каждого запроса запоминает пользовательские настройки. Последовательно расширение все расширялось и расширялось, причем большая часть функций реализовывается доработкой хранимой процедуры. Поскольку у всех разработчиков установлено по два монитора, на одном мониторе как правило в полный экран разворачивают окно вывода расширения.
Из наиболее интересных функций, пожалуй подсказка по магическим значениям.
Выделяешь код d.f1235 IN (1,2) в окне вывода отображается описание.
1 - Новый документ
2 - В обработке
Затем появилась идея добавить быстрые команды, например напечатав WL и выделив команду, в окно вывода отображаются последние изменения в объектах базы данных (название, автор, дата изменения, тип изменения и описание). Описания для хранимых процедур и функций хранятся прямо в коде, поскольку стандартов на комментарии нет, пришлось решить очередную творческую задачу :). Наличие подобной функции сразу мотивировало разработчиков писать комментарии к коду, поскольку все недочеты по документации сразу видны всем.
Приведу небольшой список функций по памяти:
Просмотр файлов, Json и Html (функция доступна в окне просмотра данных) - просто кликаем по ячейки со значением, расширение анализирует ячейку, если это ссылка на хранимые файлы, сразу выводится файл, если ячейка содержит Html текст, текст сохраняется в файл и запускается браузер, Json значение выводится в отформатированном виде в окно вывода.
Drill Down по структуре БД - выделяем SQL запрос нажимаем Alt+S, появляется таблица с данными, кликаем по ссылочной ячейке, отображаются возможные значения, по двойному клику по заголовку строки отображается отдельное окно со связанными объектами и количеством ссылок (функция доступна в окне просмотра данных). Например открываем таблицу с договорами, кликаем дважды по договору, видим 5 платежей, кликаем по платежам, отображаются платежи, дальше кликаем по платежу и т.д.
Быстрый поиск объектов. Например: fc %GetList залог, команда выведет все хранимые процедуры и функции, в которых есть таблица с похожим описанием или комментарий залог, а название хранимки или функции заканчивается на GetList.
Генерирование CRUD. Например: CRUD Data2078 R - сформируется текст процедуры чтения для таблицы, со всеми джойнами и комментариями, код процедуры будет выведен на консоль, откуда его можно скопировать в окно с кодом.
Отображение полноценного UI для выделенного SQL запроса. Например: выделям select * from dbo.Data2078 или хранимую процедуру, нажимаем Alt+S отображается отдельное окно с результатами запроса. Результаты отображаются в таблице, в таблице сразу скрыты служебные колонки (дата создания, создатель и прочие), в заголовках колонок есть описание и типы данных, есть функции экспорта в Excel, подстановка данных из справочных таблиц, есть отключаемое ограничение на количество строк и т.д.
По выделенному названию процедуры или функции, в окне вывода отображается исходный код объекта и история изменений (кто и когда изменял).
Отображение данных из небольших справочников. Например: Выделяем вспомогательный справочник dbo.Data105, в окне вывода будет выведено описание, структура таблицы и список значений (ID и Name).
Расширение писалось в свободные от плановых задач время и сейчас активно применяется и развивается, на текущий момент, расширение уже обладает десятками функций, отдельной справкой и большим планом по расширению и развитию (как только сделаю очередные плановые задачи, обязательно займусь доработкой).
Предусмотрена поддержка любых баз данных MSSQL, подсказки и описания в данном случае считываются из расширенных свойств объектов и системных представлений. Часть функций написаны в виде отдельных хранимых процедур и могут использоваться отдельно от расширения, например генератор CRUD или отображение лога работы разработчиков. У лога работы неожиданно появилась крайне полезная фуркция, быстро найти кто и что поломал :). Например можно набрать wl бронирование, расширение выведет список объектов (хранимые процедуры, функции) и авторов изменений, часто сделавший последние изменения и является автором поломки.
Итог
Пишите, настраивайте и используйте расширения и прочие полезные инструменты, невозможно эффективно и быстро автоматизировать работу пользователей, если не начать с себя и собственного рабочего процесса и процесса коллег.
Korobei
А так вопрос, не рассматривался сценарий типа — можно рядом создать сервисную баз, в ней нагенерить вьюшек с человеческими именами и по ним запросы делать. Можно еще справочные таблицы для «магических» констант добавить и джойнить когда требуется, чтобы можно было меньше магии помнить.
alixa Автор
Спасибо за комментарий, как никак первая статья на Хабре! Пока расширение внутри компании, будет время обязательно сделаю отдельную версию для широкой общественности и выложу на GitHub. Вопрос с отдельными вьюшками обсуждали, думаю на основные сущности сделаем, в первую очередь для аналитических запросов и сопровождения. Магические константы расширение по ключам ищет, а так я обычно скалярные функции делаю для часто используемых констант или объявляю константы в коде, через переменные DECLARE @OKStatus INT = 1
Korobei
Вы написали что у вас есть уже таблицы соответсвий названий с человеческими именами, по идее сделать вьюшки автоматом из такого, это вопрос пятнадцати минут.
Я имел в виду когда вы делаете запрос, то в выводе результата, у вас будет много подобных констант.
Соответсвенно когда делаете вьюшки, можно сделать JOIN с таблицей соответствия констант с удобоваримыми именами и выводить эти имена в результатах рядом с колонкой самих констант, будет сразу полегче.
Ещё пример полезного иструмента, у меня прошлый начальник сделал для проекта, для веба — дополнительный плагин для браузера и когда находишься на некой страничке, нажимаешь на кнопочку в тулбаре и тебе даётся списоск полезных запросов для этой странички. С заполнеными id-шниками и т.п. при нажатии на кнопочку, запрос (или все запросы) копировался в буфер обмена и можно было быстро и легко выполнить их и посмотреть что в базе происходит. Сделано супер просто, но время экономит очень много.
Если же у вас плагин в самой SSMS, то наверное можно там добавить небольшой http сервер, который будет слушать на порту и потом из плагина браузера, на этот порт послать запрос(ы) и выполнить их в новом окне. Особенно если несколько окружений/баз то будет очень удобно сразу подключаться к правильной базе, а то часто бывают такие грабли — пытаешься данные посмотреть, а потом оказывается что ищещь в dev базе, а данные от прода.
alixa Автор
Ссылка на проект донор https://github.com/gandarez/ssms-wakatime
С формированием по описаниям сразу пришла идея, но названия представлений и колонок будут слишком длинными и на русском языке, да и таблиц тысячи, как вы понимаете не все нужны.
По константам - в результатах запросов все ок вроде, БД не совсем кривая, магические константы используются в основном в условиях запросов и коде хранимок для условной логики.
Часть функциональности из расширения также доступна в виде консольной утилиты, многие IDE из коробки умеют отправлять выделенный кусок текста через аргументы командной строки (так называемые внешние инструменты), правда в данном случае приходится еще быстрые клавиши вешать (что не совсем удобно).
В Managment Studio из коробки можно цвета настраивать для соединений, очень удобно, рекомендую.
Korobei
Но всё равно лучше чем ничего.