Поиск хранимой процедуры по тексту
Пересказ статьи 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, чтобы увидеть каждую базу данных, на которой выполняется ваш скрипт:
Включает ли ваша хранимая процедура номер версии в комментариях или где-нибудь еще в пределах скрипта? Есть ли дата, наряду с кратким описанием изменений на каждой итерации хранимой процедуры? Если это так, то это хорошие варианты для использования при поиске. Если ничего этого нет, ищите текст, который имеется только в новой процедуре.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой