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_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 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