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


sp_refreshsqlmodule (Transact-SQL)

Обновляет метаданные для указанной не привязанной к схеме хранимой процедуры, определяемой пользователем функции, представления, триггера DML, а также триггера DDL уровня базы данных или сервера в текущей базе данных. Непрерывные метаданные для этих объектов, такие как типы данных параметров, могут устаревать по причине изменений их базовых объектов.

Значок ссылки на разделСоглашение о синтаксисе Transact-SQL

Синтаксис

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
    [ , [ @namespace = ] ' <class> ' ]

<class> ::=
{
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

Аргументы

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

  • [ , @namespace = ] ' <class> '
    Класс указанного модуля. Если аргумент module_name является триггером DDL, необходимо указывать аргумент <class>. Допустимыми входными значениями являются DATABASE_DDL_TRIGGER и SERVER_DDL_TRIGGER.

    Параметр <class> имеет тип nvarchar(20).

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

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

Замечания

Хранимую процедуру sp_refreshsqlmodule необходимо выполнять в тех случаях, когда внесены изменения в объекты, находящиеся в основе модуля и влияющие на его определение. В противном случае при обращении к модулю или при его вызове могут быть получены непредвиденные результаты. Для обновления представления можно использовать процедуру sp_refreshsqlmodule или sp_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 AdventureWorks2008R2;
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

Б. Обновление триггера DDL уровня базы данных

В представленном ниже примере обновляется триггер DDL уровня базы данных.

USE AdventureWorks2008R2;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO

В. Обновление триггера DDL уровня сервера

В представленном ниже примере обновляется триггер DDL уровня сервера.

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