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


sp_refreshsqlmodule (Transact-SQL)

Применимо к: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