Столбец sys.objects [name] не соответствует имени объекта в определении (имя хранимой процедуры)
На прошлой неделе, как часть одного требования, я написал скрипт для генерации определения объекта для всех объектов базы данных.
Во время тестирования я обнаружил, что для нескольких хранимых процедур [sys.objects].name не совпадает с именем в реальном определении объекта (как возвращено OBJECT_DEFINITION(Object_ID)). Это было очень странно, и я увидел это впервые в жизни.
Размышляя о том, что может быть причиной того же самого, я обнаружил, что это происходит, когда мы переименовываем хранимую процедуру из Object Explorer (View -> Object Explorer в SQL Server Management studio).
Просто интересно, есть ли способ получить реальное имя объекта (в данном случае, имя SP)?
2 ответа
У меня такая же проблема. Похоже, что SP_RENAME не обновляет определение объекта. По ссылке sp_rename Microsoft сообщает:
Переименование хранимой процедуры, функции, представления или триггера не изменит имя соответствующего объекта ни в столбце определения представления каталога sys.sql_modules, ни в результате использования встроенной функции OBJECT_DEFINITION. Поэтому мы рекомендуем не использовать sp_rename для переименования этих типов объектов. Вместо этого удалите и заново создайте объект с его новым именем.
У меня была похожая ситуация, когда хранимая процедура была переименована с использованием sp_rename. Новое имя было итеративным с расширением *_1. Если исходное имя было "MyProcedure", новое имя было бы "MyProcedure_1".
"MyProcedure" представляет производственный код. MyProcedure_1 представлял код, который когда-то был рабочим кодом, но теперь устарел. Действительно, MyProcedure_1 ссылался на объекты, которых больше не было в базе данных.
При просмотре имени в sys.objects, там было новое имя с расширением ('MyProcedure_1'), но object_definition вернуло старое имя ('MyProcedure'), но с кодом для 'MyProcedure_1'.
Это было обнаружено с помощью вызова MyProcedure, в котором произошла ошибка из-за отсутствующих объектов.
Решение состояло в том, чтобы DROP 'MyProcedure_1', который эффективно удалил object_id и ошибочное object_definition, и заново его создал. Конечно, нам пришлось обратиться к пропавшим предметам. И - мы распространяем осторожность при использовании sp_rename для объектов, отличных от таблиц / столбцов.