Добавить / удалить столбцы таблицы - сопровождение / оптимизация кода
Каков наилучший способ сохранить код большого проекта?
Допустим, у вас есть 1000 хранимых процедур, и вы должны добавить новый столбец в таблицу (или удалить)
Там может быть 1-2 или 30 хранимых процедур, которые могут быть затронуты.
Просто один "поиск" по имени таблицы может быть недостаточно хорошим, скажем, вам нужно знать только те места, где в таблице есть вставка / обновление / удаление.
поиск 'вставки имени таблицы' может быть хорошей идеей, но у вас может быть пробел между этими двумя словами или двумя пробелами, или TAB ... может быть, имя таблицы написано как '[tablename]' То же самое для всех 3 (вставка / обновление / удаление).
Я в основном ищу какие-то "ограниченные зависимости"
Как это обрабатывается наилучшим образом?
Сохранить таблицу базы данных с такой информацией и изменять эту таблицу каждый раз, когда вносите изменения в хранимые процедуры?
Рядом с каждой вставкой / обновлением / удалением храните какой-то определенный код в качестве комментария, и таким образом вы сможете искать то, что вам нужно? Пример: 'insert_tablename', 'update_tablename', 'delete_tablename'
у кого есть идея получше?
1 ответ
В идеале изменения обратно совместимы. Не только для того, чтобы вы могли изменить таблицу, не нарушая всех объектов, которые на нее ссылаются, но также и для того, чтобы вы могли развернуть все изменения базы данных перед развертыванием всего кода приложения (в распределенной архитектуре представьте себе загружаемое настольное приложение). или приложение для iPhone, где люди подключаются к вашей базе данных удаленно, это очень важно).
Например, если вы добавляете новый столбец в таблицу, он должен иметь значение NULL или иметь значение по умолчанию, чтобы операторы INSERT не нуждались в немедленном обновлении для ссылки на него. Хранимые процедуры можно постепенно обновлять, чтобы принять новый параметр для представления этого столбца, и он должен быть обнуляемым / необязательным, чтобы приложения (-и) не должны были сразу знать об этом столбце. И т.п.
Это также требует, чтобы ваши исходные операторы вставки включали явный список столбцов. Если вы просто скажете:
INSERT dbo.table VALUES(@p1, @p2, ...);
Тогда это значительно усложняет совместимость ваших изменений.
Что касается удаления столбца, ну, это немного сложнее. Зависимости не идеальны в SQL Server, но вы должны быть в состоянии найти много информации из этих динамических объектов управления:
Вы также можете найти эти статьи интересными:
- https://sqlblog.org/2008/09/09/keeping-sysdepends-up-to-date-in-sql-server-2008
- http://www.mssqltips.com/sqlservertip/2035/make-your-sql-server-database-changes-backward-compatible-when-adding-a-new-column/
- http://www.mssqltips.com/sqlservertip/2050/make-your-sql-server-database-changes-backward-compatible-when-dropping-a-column/
- http://www.mssqltips.com/sqlservertip/2071/make-your-sql-server-database-changes-backward-compatible-when-renaming-an-entity/
- http://www.mssqltips.com/sqlservertip/2074/make-your-sql-server-database-changes-backward-compatible-when-changing-a-relationship/