Compartilhar via


sp_refreshsqlmodule (Transact-SQL)

Atualiza os metadados do procedimento armazenado não associado a esquema, da função definida pelo usuário, da exibição, do gatilho DML, do gatilho DDL de nível de banco de dados ou do gatilho DDL de nível de servidor especificado no banco de dados atual. Metadados persistentes desses objetos, como tipos de dados de parâmetros, podem ficar desatualizados devido a atualizações em seus objetos subjacentes.

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

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

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

Argumentos

  • [ @name= ] 'module_name'
    É o nome do procedimento armazenado, função definida pelo usuário, exibição, gatilho DML, gatilho DDL de nível do banco de dados ou gatilho DDL do nível de servidor. module_name não pode ser um procedimento armazenado CLR (Common Language Runtime) ou uma função CLR. module_name não pode ser associado por esquema. module_name é nvarchar, sem padrão. module_name pode ser um identificador de várias partes, mas pode fazer referência a objetos no banco de dados atual.

  • [ , @namespace = ] ' <class> '
    É a classe do módulo especificado. Quando module_name é um gatilho DDL, <class> é obrigatório. Entradas válidas são DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.

    <class> é nvarchar(20).

Valores de código de retorno

0 (êxito) ou um número diferente de zero (falha)

Comentários

sp_refreshsqlmodule deve ser executado quando forem feitas alterações aos objetos subjacentes ao módulo que afeta sua definição. Caso contrário, o módulo pode produzir resultados inesperados quando consultado ou invocado. Para atualizar uma exibição, você pode usar sp_refreshsqlmodule ou sp_refreshview com os mesmos resultados.

sp_refreshsqlmodule não afeta nenhuma permissão, propriedade estendida ou opção SET associada ao objeto.

Para atualizar um gatilho DDL de nível de servidor, execute este procedimento armazenado a partir do contexto de qualquer banco de dados.

ObservaçãoObservação

Toda assinatura associada ao objeto é ignorada na execução de sp_refreshsqlmodule.

Permissões

Requer permissão ALTER no módulo e permissão REFERENCES em qualquer tipo CLR definido pelo usuário e coleções de esquemas XML referidas pelo objeto. Requer permissão ALTER ANY DATABASE DDL TRIGGER no banco de dados atual se o módulo especificado for um gatilho DDL de nível de banco de dados. Requer permissão CONTROL SERVER se o módulo especificado for um gatilho DDL de nível de servidor.

Além disso, em módulos definidos com a cláusula EXECUTE AS, requer permissão IMPERSONATE no principal especificado. Geralmente, atualizar um objeto não altera seu principal EXECUTE AS, a menos que o módulo tenha sido definido com EXECUTE AS USER e o nome de usuário do principal resolve, agora, um usuário diferente do que na ocasião em que o módulo foi criado.

Exemplos

A.Atualizando uma função definida pelo usuário

O exemplo a seguir atualiza uma função definida pelo usuário. O exemplo cria um tipo de dados de alias, mytype, e uma função definida pelo usuário, to_upper, que usa mytype. Em seguida, mytype é renomeado para myoldtype e um novo mytype é criado, com uma definição diferente. A função dbo.to_upper é atualizada de modo a fazer referência à nova implementação de mytype, em lugar da antiga.

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

B.Atualizando um gatilho DDL de nível de banco de dados

O exemplo a seguir atualiza um gatilho DDL de nível de banco de dados.

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

C.Atualizando um gatilho DDL de nível de servidor

O exemplo a seguir atualiza um gatilho DLL de nível de servidor.

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

Consulte também

Referência

sp_refreshview (Transact-SQL)

Procedimentos armazenados do Mecanismo de Banco de Dados (Transact-SQL)