Skip to content

Поиск хранимой процедуры по тексту

Пересказ статьи Chad Callihan. Searching a Stored Procedure for Text


Такая история. Пусть сервер баз данных получил новый релиз, который включает изменение хранимой процедуры. Предполагается, что все базы данных получают обновления, но по той или иной причине возникли проблемы с релизом, и он должен быть остановлен на полпути. Возможно, некоторые изменения откатились, а другие - нет. Мы не имеем точной журнализации, какие базы данных обновились, но мы хотим знать, обновилась ли хранимая процедура до новой версии, или осталась в старой.

Как нам проверить эти изменения?


Во-первых, нам нужен запрос для поиска хранимой процедуры в базе данных. Мы можем сделать это с помощью следующего запроса:

SELECT O.name, O.create_date, O.modify_date, m.definition
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition LIKE '%SEARCH_TEXT%';
GO

Следуя нашему примеру, если мы хотим подтвердить, что база данных имеет процедуру ExampleProc, обновленную до версии 1.2.3, и это указано в хранимой процедуре, мы могли бы увидеть следующее, заменив SEARCH_TEXT в скрипте выше на 1.2.3:



За пределами одной базы данных


Этого достаточно нам для поиска в одной базе данных, но у нас множество баз данных, которые мы хотим просмотреть. Нужно ли нам выполнять этот скрипт на каждой отдельной базе данных поочередно? Вы можете это делать, если хотите, но я не рекомендовал бы вам тратить так много времени. Вместо этого, я бы посоветовал сочетать скрипт выше с процедурой Aaron Bertrand sp_ineachdb.

Возможно, вам знакома системная процедура sp_MSforeachdb, которая доступна в SQL Server по умолчанию. Но вы можете не знать, что хотя она имеется и может быть обнаружена во многих источниках как решение для выполнения запроса на всех базах данных, она фактически не поддерживается. Кроме того, есть обстоятельства, когда базы данных могут быть пропущены, хотя её название - foreachdb - говорит об обратном. Microsoft не собирается тратить время на её исправление, поскольку она официально не поддерживается. Это означает, что вы можете либо самостоятельно проверять выполнение её работы, либо перейти к sp_ineachdb.

Использование sp_ineachdb в нашем примере будет выглядеть примерно так:

EXEC dbo.sp_ineachdb @user_only = 1, @command = N'SELECT DB_NAME() AS ''Database'',O.name, O.create_date, O.modify_date, m.definition
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition LIKE ''%1.2.3%'';';




Вы можете также использовать @select_dbname=1 в sp_ineachdb, чтобы увидеть каждую базу данных, на которой выполняется ваш скрипт:



Включает ли ваша хранимая процедура номер версии в комментариях или где-нибудь еще в пределах скрипта? Есть ли дата, наряду с кратким описанием изменений на каждой итерации хранимой процедуры? Если это так, то это хорошие варианты для использования при поиске. Если ничего этого нет, ищите текст, который имеется только в новой процедуре.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.