Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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