Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics (только выделенный пул SQL)
База данных SQL в Microsoft Fabric
Обновляет метаданные для указанной не привязанной к схеме хранимой процедуры, определяемой пользователем функции, представления, триггера DML, а также триггера DDL уровня базы данных или сервера в текущей базе данных. Непрерывные метаданные для этих объектов, такие как типы данных параметров, могут устаревать по причине изменений их базовых объектов. Например, может появиться ошибка The definition for user-defined data type 'typename' has changed. Обновление метаданных для модуля, использующего тип, указанный в ошибке, может устранить проблему.
Соглашения о синтаксисе Transact-SQL
sp_refreshsqlmodule
[ @name = ] N'name'
[ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]
Аргументы
[ @name = ] N'name'
Имя хранимой процедуры, определяемой пользователем функции, представления, триггера DML, триггера DDL уровня базы данных или триггера DDL уровня сервера. @name — nvarchar(776), без значения по умолчанию. @name не может быть хранимой процедурой среды CLR или функцией CLR. @name не может быть привязана к схеме. @name может быть многокомпонентным идентификатором, но может ссылаться только на объекты в текущей базе данных.
[ @namespace = ] N'namespace'
Класс указанного модуля.
@namespace — nvarchar(20), с значением по умолчаниюOBJECT. Если @name является триггером DDL, @namespace требуется. Допустимые входные данные и DATABASE_DDL_TRIGGERSERVER_DDL_TRIGGER.
Значения кода возврата
0 (успешно) или ненулевое число (сбой).
Замечания
sp_refreshsqlmodule следует запускать при внесении изменений в объекты, лежащие в основе модуля, влияющие на его определение. В противном случае модуль может привести к непредвиденным результатам при запросе или вызове. Чтобы обновить представление, можно использовать sp_refreshsqlmodulesp_refreshview либо с одинаковыми результатами.
sp_refreshsqlmodule не влияет на разрешения, расширенные свойства или SET параметры, связанные с объектом.
Чтобы обновить триггер DDL уровня сервера, необходимо выполнить эту хранимую процедуру в контексте любой базы данных.
Примечание.
При запуске sp_refreshsqlmoduleвсе подписи, связанные с объектом, удаляются.
Разрешения
Требуется ALTER разрешение на модуль и разрешение на любые определяемые пользователем типы среды CLR и REFERENCES коллекции схем XML, на которые ссылается объект. Требует ALTER ANY DATABASE DDL TRIGGER разрешения в текущей базе данных, если указанный модуль является триггером DDL уровня базы данных. Требует CONTROL SERVER разрешения, если указанный модуль является триггером DDL уровня сервера.
Кроме того, для модулей, определенных с EXECUTE AS предложением, IMPERSONATE требуется разрешение на указанный субъект. Как правило, обновление объекта не изменяет его EXECUTE AS субъект, если модуль не определен и EXECUTE AS USER имя пользователя субъекта теперь разрешает пользователю, отличному от пользователя во время создания модуля.
Примеры
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
А. Обновление определяемой пользователем функции
В следующем примере показано обновление определяемой пользователем функции. В примере создается псевдоним типа данных mytype и определяемая пользователем функция to_upper, использующая mytype.
mytype Затем переименовывается myoldtypeв , а новое mytype создается в другое определение. Функция dbo.to_upper обновляется таким образом, что она будет ссылаться на новую реализацию mytype вместо прежней.
На первом шаге создайте тип псевдонима.
USE AdventureWorks2022;
GO
IF EXISTS (SELECT 'mytype'
FROM sys.types
WHERE name = 'mytype')
DROP TYPE mytype;
GO
CREATE TYPE mytype
FROM NVARCHAR (5);
GO
IF OBJECT_ID('dbo.to_upper', 'FN') IS NOT NULL
DROP FUNCTION dbo.to_upper;
GO
CREATE FUNCTION dbo.to_upper (@a mytype)
RETURNS mytype
WITH ENCRYPTION
AS
BEGIN
RETURN UPPER(@a);
END
GO
SELECT dbo.to_upper('abcde');
GO
Затем увеличьте длину типа псевдонима.
EXECUTE sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO
CREATE TYPE mytype
FROM NVARCHAR (10);
GO
Параметр функции по-прежнему использует старый тип и завершается ошибкой из-за усечения.
SELECT name,
TYPE_NAME(user_type_id)
FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO
SELECT dbo.to_upper('abcdefgh'); -- Fails because of truncation
GO
Обновите функцию, чтобы привязаться к переименованного типа.
EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';
Теперь параметры функции привязаны к правильному типу и оператор работает правильно.
SELECT name,
TYPE_NAME(user_type_id)
FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO
SELECT dbo.to_upper('abcdefgh');
GO
B. Обновление триггера DDL уровня базы данных
В представленном ниже примере обновляется триггер DDL уровня базы данных.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
В. Обновление триггера DDL уровня сервера
В представленном ниже примере обновляется триггер DDL уровня сервера.
USE master;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO