sp_refreshsqlmodule (Transact-SQL)
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics (только выделенный пул SQL)
Обновляет метаданные для указанной не привязанной к схеме хранимой процедуры, определяемой пользователем функции, представления, триггера 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_TRIGGER
SERVER_DDL_TRIGGER
.
Значения кода возврата
0
(успешно) или ненулевое число (сбой).
Замечания
sp_refreshsqlmodule
следует запускать при внесении изменений в объекты, лежащие в основе модуля, влияющие на его определение. В противном случае модуль может привести к непредвиденным результатам при запросе или вызове. Чтобы обновить представление, можно использовать sp_refreshsqlmodule
sp_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
имя пользователя субъекта теперь разрешает пользователю, отличному от пользователя во время создания модуля.
Примеры
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества 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
Затем увеличьте длину типа псевдонима.
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
Обновите функцию, чтобы привязаться к переименованного типа.
EXEC 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
EXEC sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Обновление триггера DDL уровня сервера
В представленном ниже примере обновляется триггер DDL уровня сервера.
USE master;
GO
EXEC sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO