sp_refreshsqlmodule (Transact-SQL)
Добавления: 12 декабря 2006 г.
Обновляет метаданные для указанной хранимой процедуры, не привязанной к схеме, определяемой пользователем функции или представления. Непрерывные метаданные для этих объектов, такие как типы данных параметров, могут устаревать по причине изменений их базовых объектов.
Синтаксические обозначения в Transact-SQL
Синтаксис
sp_refreshsqlmodule [ @name = ] 'module_name'
Аргументы
- [ @name= ] 'module_name'
Имя хранимой процедуры, функции или представления. Аргумент module_name не может быть хранимой процедурой среды CLR или функцией CLR. Аргумент module_name не может быть привязан к схеме. Аргумент module_name имеет тип nvarchar и не имеет значения по умолчанию. Аргумент module_name может являться составным идентификатором, однако может обращаться только к объектам текущей базы данных.
Значения кодов возврата
0 (успешное завершение) или ненулевое значение (неуспешное завершение)
Замечания
Хранимую процедуру sp_refreshsqlmodule следует выполнять, если внесены изменения в объекты, находящиеся в основе хранимой процедуры, пользовательской функции или представления, влияющие на ее определение. В противном случае при обращении к объекту или при его вызове можно получить непредвиденные результаты. Для обновления представления можно использовать процедуру sp_refreshsqlmodule или sp_refreshview с теми же результатами.
Процедура sp_refreshsqlmodule не влияет на какие-либо разрешения, расширенные свойства или параметры SET, связанные с объектом.
Любые подписи, связанные с объектом, удаляются при выполнении процедуры sp_refreshsqlmodule.
Разрешения
Необходимо разрешение ALTER для хранимой процедуры, функции или представления, и разрешение REFERENCES для определяемых пользователями типов данных CLR и коллекций XML-схем, на которые ссылается объект.
Кроме того, для модулей, определенных при помощи предложения EXECUTE AS, на указанном участнике необходимо разрешение IMPERSONATE. Обычно обновление объекта не изменяет его участника EXECUTE AS, если модуль не был определен при помощи предложения EXECUTE AS USER, и имя пользователя участника не является результатом пользователя, отличного от пользователя в момент создания модуля.
Примеры
В следующем примере показано обновление пользовательской функции. В примере создается псевдоним типа данных mytype
и пользовательская функция to_upper
, использующая mytype
. Затем тип данных mytype
переименовывается в myoldtype
, и создается новый тип данных mytype
с другим определением. Функция to_upper
обновляется таким образом, что она будет ссылаться на новую реализацию mytype
вместо прежней.
-- Create an alias type.
USE AdventureWorks;
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 ('to_upper', 'FN') IS NOT NULL
DROP FUNCTION to_upper;
GO
CREATE FUNCTION 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
См. также
Справочник
sp_refreshview (Transact-SQL)
Хранимые процедуры ядра СУБД (Transact-SQL)