Хранимые процедуры MSSQL2005 - PullRequest
3 голосов
/ 15 ноября 2008

Если у вас много хранимых процедур и вы меняете имя столбца таблицы, есть ли способ проверить, какие хранимые процедуры больше не будут работать?


Обновление : я прочитал некоторые ответы, и мне ясно, что простого способа сделать это не существует. Будет ли легче отойти от хранимых процедур?

Ответы [ 5 ]

4 голосов
/ 15 ноября 2008

Я большой поклонник SysComments для этого:

SELECT DISTINCT Object_Name(ID) 
FROM SysComments 
WHERE text LIKE '%Table%'
AND text LIKE '%Column%'
3 голосов
/ 15 ноября 2008

На это есть ответ в стиле книги и реальный ответ.

Во-первых, для ответа на книгу вы можете использовать sp_depends, чтобы увидеть, какие другие хранимые процессы ссылаются на таблицу (не на отдельный столбец), а затем исследовать те, чтобы увидеть, ссылаются ли они на таблицу:

http://msdn.microsoft.com/en-us/library/ms189487.aspx

Реальный ответ, однако, заключается в том, что во многих случаях это не работает:

  • Динамические строки SQL: если вы строите строки динамически, либо в хранимой процедуре, либо в коде приложения, а затем выполняете эту строку, SQL Server не может узнать, что делает ваш код. Возможно, в вашем коде жестко задано имя столбца, и это сломается.
  • Встроенный код T-SQL: если у вас есть код в приложении (не в SQL Server), то ничто на стороне SQL Server не обнаружит его.

Другим вариантом является использование SQL Server Profiler для захвата трассировки всей активности на сервере, а затем поиск в захваченных запросах нужного имени поля. Это не очень хорошая идея на рабочем сервере, потому что профиль несет некоторые накладные расходы, но он работает - большую часть времени. Он сломается, если ваше приложение выполнит «SELECT *», а затем в вашем приложении вы ожидаете, что определенное имя поля вернется как часть этого набора результатов.

Вы, вероятно, начинаете понимать, что не существует простого, простого способа сделать это.

2 голосов
/ 15 ноября 2008

Хотя это займет большую часть работы, лучший способ убедиться, что все работает, - написать интеграционные тесты .

Интеграционные тесты похожи на модульные тесты, за исключением того, что в этом случае они интегрируются с базой данных. Это потребует некоторых усилий, но вы можете легко написать тесты, которые осуществляют каждую хранимую процедуру, чтобы убедиться, что она выполняется без ошибок.

В простейшем случае он просто выполнил бы sp и удостоверился, что ошибки нет, и не беспокоился о реальных результатах. Если ваши тесты только что выполнили sp без проверки результатов, вы можете написать много общего.

Для этого вам понадобится база данных для выполнения. Несмотря на то, что вы можете настроить базу данных и развернуть свои хранимые протоколы вручную, лучшим способом будет использование непрерывной интеграции для автоматического получения новейшего кода (DDL базы данных, хранимых процедур, тестов) из вашей системы управления версиями, построения базы данных и выполнения ваших тесты. Это будет происходить каждый раз, когда вы вносите изменения в систему контроля версий.

Да, похоже, много работы. Это много работы, но отдача тоже большая. Возможность гарантировать, что ваши изменения ничего не нарушают, позволяет быстрее продвигать ваш продукт с лучшим качеством.

Взгляните на NUnit и NDbUnit

0 голосов
/ 15 ноября 2008

Если вы заинтересованы только в поиске использования столбца в хранимой процедуре, вероятно, лучшим способом будет поиск грубой силы по имени столбца в таблице sys.sql_modules столбца определения, в котором хранится определение хранимых процедур. /functions.

0 голосов
/ 15 ноября 2008

Я уверен, что есть более элегантные способы решения этой проблемы, но если база данных не слишком сложна, вот быстрый и грязный способ:

Выберите все sprocs и сценарий в окне запроса.

Поиск старого имени столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...