Переименование - это опасное времяпрепровождение, поскольку оно плохо сочетается с ограниченной реализацией отслеживания зависимостей в SQL Server и отложенным разрешением имен хранимых процедур.Я не смог воспроизвести этот конкретный сценарий на SQL Server 2017 (зависимости были правильно отслежены, если в теле процедуры используется UDT), поэтому возможно, что этот случай был улучшен.Конечно, если вы используете UDT в качестве параметра , он фактически обнаруживает проблему и выдает соответствующее сообщение об ошибке:
CREATE TYPE BadUdt FROM NVARCHAR(10);
GO
CREATE PROCEDURE AreUdtsBadThough(@T BadUdt) AS BEGIN
RETURN;
END;
GO
EXEC sp_rename 'BadUdt', 'GoodUdt';
GO
CREATE TYPE BadUdt FROM NVARCHAR(20);
GO
EXEC AreUdtsBadThough NULL
Сообщение 496, Уровень 16, Состояние 1, ПроцедураAreUdtsBadThough, Строка 6 [Batch Start Line 16] Параметр "@T" отличается от типа, с которым он был создан.Удалите и заново создайте модуль, используя двухэлементное имя для типа, или используйте sp_refreshsqlmodule для обновления метаданных его параметров.
Несмотря на изменение имени, параметр AreUdtsBadThough
по-прежнему связан со старымвведите по идентификатору, поэтому вы не можете удалить это:
SELECT p.[name], t.[name]
FROM sys.parameters p
JOIN sys.types t ON p.user_type_id = t.user_type_id
WHERE [object_id] = OBJECT_ID('AreUdtsBadThough')
+------+---------+
| name | name |
+------+---------+
| @T | GoodUdt |
+------+---------+
Ошибка полезно описывает общее решение проблем с зависимостями: invoke sp_refreshsqlmodule
, что вызываетхранимая процедура (или функция, или триггер, или представление) для эффективной перекомпиляции и обновления зависимостей:
EXEC sp_refreshsqlmodule 'AreUdtsBadThough'
SELECT p.[name], t.[name]
FROM sys.parameters p
JOIN sys.types t ON p.user_type_id = t.user_type_id
WHERE [object_id] = OBJECT_ID('AreUdtsBadThough')
+------+--------+
| name | name |
+------+--------+
| @T | BadUdt |
+------+--------+
А теперь GoodUdt
больше не имеет зависимостей и может быть отброшена.
Проблема не всегда корректно обновляемых зависимостей (которая не ограничивается переименованием) побудила некоторых людей придумать более постоянные решения.Аарон Бертран (Aaron Bertrand) написал статью об автоматизации обновлений зависимостей для SQL Server 2008 (которая должна работать в более поздних выпусках, даже если она может выполнять больше работы, чем необходимо) из-за улучшенных проверок зависимостей.