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

Синтаксис

sys.sp_refreshsqlmodule [ @name = ] 'module_name'   
    [ , [ @namespace = ] ' <class> ' ]  
  
<class> ::=  
{  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  
  

Аргументы

@name

Имя хранимой процедуры, определяемой пользователем функции, представления, триггера DML, триггера DDL уровня базы данных или триггера DDL уровня сервера. module_name не может быть хранимой процедурой среды CLR или функцией CLR. module_name не может быть привязана к схеме. module_name — nvarchar, без значения по умолчанию. module_name может быть идентификатором нескольких частей, но может ссылаться только на объекты в текущей базе данных.

@namespace

Класс указанного модуля. Если module_name является триггером DDL, <требуется класс> . <класс> nvarchar(20). Допустимые входные значения:

  • DATABASE_DDL_TRIGGER

  • SERVER_DDL_TRIGGER. Применимо к SQL Server 2008 (10.0.x) и более поздним версиям.

Значения кода возврата

0 (успешное завершение) или ненулевое значение (неуспешное завершение)

Замечания

Системная хранимая процедура sp_refreshsqlmodule должна выполняться при внесении изменений в объекты, лежащие в основе модуля, влияющие на его определение. В противном случае при обращении к модулю или при его вызове могут быть получены непредвиденные результаты. Чтобы обновить представление, можно использовать sp_refreshsqlmodulesp_refreshview либо с одинаковыми результатами.

sp_refreshsqlmodule не влияет на разрешения, расширенные свойства или параметры SET, связанные с объектом.

Чтобы обновить триггер DDL уровня сервера, необходимо выполнить эту хранимую процедуру в контексте любой базы данных.

Примечание.

При запуске sp_refreshsqlmoduleвсе подписи, связанные с объектом, удаляются.

Разрешения

При ссылке объекта на модуль необходимо разрешение ALTER, а при использовании модулем определяемых пользователем типов данных CLR и коллекций схем XML на них требуется разрешение REFERENCES. Если указанный модуль является триггером DDL уровня базы данных, то для текущей базы данных требуется разрешение ALTER ANY DATABASE DDL TRIGGER. Если указанный модуль является триггером DDL уровня сервера, необходимо разрешение CONTROL SERVER.

Кроме того, для модулей, определенных при помощи предложения EXECUTE AS, на указанном участнике необходимо разрешение IMPERSONATE. Обычно обновление объекта не изменяет его участника EXECUTE AS, если модуль не был определен при помощи предложения EXECUTE AS USER, и имя пользователя участника не является результатом пользователя, отличного от пользователя в момент создания модуля.

Примеры

А. Обновление определяемой пользователем функции

В следующем примере показано обновление определяемой пользователем функции. В примере создается псевдоним типа данных mytype и определяемая пользователем функция to_upper, использующая mytype. Затем тип данных mytype переименовывается в myoldtype, и создается новый тип данных mytype с другим определением. Функция dbo.to_upper обновляется таким образом, что она будет ссылаться на новую реализацию mytype вместо прежней.

-- Create an alias type.  
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  
  
-- Increase the length of the alias type.  
sp_rename 'mytype', 'myoldtype', 'userdatatype';  
GO  
  
CREATE TYPE mytype FROM nvarchar(10);  
GO  
  
-- The function parameter still uses the old type.  
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  
  
-- Refresh the function to bind to the renamed type.  
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';  
  
-- The function parameters are now bound to the correct type and the statement works correctly.  
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 уровня сервера.

Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

USE master;  
GO  
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';  
GO  

Следующие шаги