Поделиться через


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