Как разработчик, в основном пишущий С#, я применил некоторые хорошие практики при написании кода С#. Когда я иногда пишу хранимые процедуры, мне не удается применить эти методы к коду хранимой процедуры.
В нескольких случаях я унаследовал код хранимой процедуры кошмара, сначала три или четыре уровня хранимых процедур, устанавливающих некоторые временные таблицы и в основном вызывающие друг друга. Никакой реальной работы и всего лишь нескольких строк кода. Затем, наконец, есть вызов "последней" хранимой процедуры, большого монстра из 3000-5000 строк кода SQL. В этом коде обычно много запахов кода, например, дублирование кода, сложные потоки управления (aka spaghetti) и метод, который делает слишком много вещей, уложенных друг за другом без четкого разделения, когда начинается один кусок работы и где он заканчивается (даже не комментарий как делитель).
Я также заметил использование исключенных комментариев, которые выбирают из промежуточных временных таблиц. Выбора могут быть возвращены для целей отладки, но их необходимо удалить до того, как какой-либо код вызова ожидает определенного порядка возвращаемых наборов результатов.
По-видимому, мои товарищи по команде также разделяют мой недостаток хороших методов написания SQL.
Итак... (и здесь возникает реальный вопрос)... что такое хорошая практика для написания модульных поддерживаемых хранимых процедур?
Приветствуются как домашние методы, так и ссылки на книги/блоги. Методы, а также инструменты, которые помогают с определенными задачами.
Давайте кратко изложим некоторые области, в которых я не нашел хороших практик
- Модуляция и инкапсуляция (хранится ли процедура обмена данными через временные таблицы на самом деле, как идти?)
- В С# я использую сборки, классы и методы, украшенные модификаторами доступа, чтобы выполнить это.
- Отладка/тестирование (лучше, чем изменение цели отладки?)
- Инструменты отладки
- Отладка трассировки?
- Испытательные светильники?
- Подчеркивание кода/логики/данных/потока управления с использованием кода структуры кода
- В С# я рефакторинг и выходим из более мелких методов, которые выполняют только одну логическую задачу.
- Дублирование кода
В основном я сталкиваюсь с SQL Server как СУБД, но ответы или ответы на агенты DBMS указывают на особенности других СУБД: es, которые также помогают в вышеуказанных случаях.
Чтобы дать некоторый фон: большинство крупных хранимых процедур, с которыми я столкнулся, находятся в сценариях отчетов, где база должна просто создавать некоторые сводные значения из большой таблицы. Но по пути вам нужно исключить некоторые из значений, которые встречаются в какой-либо таблице исключений, добавьте некоторые значения в какую-то еще не заполненную таблицу материалов, сравните с прошлым годом (можете ли вы представить себе уродливый код, который обрабатывает продукты, меняющие отдел между годами?) и т.д.