sp_refreshsqlmodule (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

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

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

Аргументы

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

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

    DATABASE_DDL_TRIGGER

    SERVER_DDL_TRIGGER

    Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

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

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 AdventureWorks2012;
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 AdventureWorks2012;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO

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

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

Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

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

См. также

Справочник

sp_refreshview (Transact-SQL)

Хранимые процедуры ядра СУБД (Transact-SQL)