Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do
AzureInstância
Gerenciada de SQL do AzureAzure Synapse Analytics (somente pool de SQL dedicado)
Banco de dados SQL no Microsoft Fabric
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. Por exemplo, você pode ver um erro como The definition for user-defined data type 'typename' has changed. Atualizar os metadados do módulo que usa o tipo especificado no erro pode resolver o problema.
Convenções de sintaxe de Transact-SQL
sp_refreshsqlmodule
[ @name = ] N'name'
[ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]
Argumentos
[ @name = ] N'nome'
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. @name é nvarchar(776), sem padrão. @name não pode ser um procedimento armazenado CLR (Common Language Runtime) nem uma função CLR. @name não pode ser vinculado ao esquema. @name pode ser um identificador de várias partes, mas só pode se referir a objetos no banco de dados atual.
[ @namespace = ] N'namespace'
A classe do módulo especificado.
@namespace é nvarchar(20), com um padrão de OBJECT. Quando @name é um gatilho DDL, @namespace é obrigatório. As entradas válidas são DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.
Valores do código de retorno
0 (êxito) ou um número diferente de zero (falha)
Comentários
sp_refreshsqlmodule deve ser executado quando são feitas alterações nos objetos subjacentes ao módulo que afetam 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 um ou sp_refreshsqlmodulesp_refreshview com os mesmos resultados.
sp_refreshsqlmodule não afeta nenhuma permissão, propriedade estendida ou opção SET que esteja 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ção
Todas as assinaturas associadas ao objeto são descartadas quando você executa sp_refreshsqlmodule.
Permissões
Requer a permissão ALTER no módulo e a permissão REFERENCES em todos os tipos de dados CLR definidos pelo usuário e coleções de esquema XML referenciados pelo objeto. Requer ALTER ANY DATABASE DDL TRIGGER permissão no banco de dados atual quando o módulo especificado é um gatilho DDL no nível do banco de dados. Requer CONTROL SERVER permissão quando o módulo especificado é um gatilho DDL no nível do servidor.
Além disso, para módulos definidos com a EXECUTE AS cláusula, IMPERSONATE a permissão é necessária na entidade de segurança especificada. Geralmente, a atualização de um objeto não altera sua EXECUTE AS entidade de segurança, a menos que o módulo tenha sido definido com EXECUTE AS USER e o nome de usuário da entidade de segurança agora seja resolvido para um usuário diferente do usuário no momento em que o módulo foi criado.
Exemplos
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.
R. Atualizar 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.
Na primeira etapa, crie um tipo de alias.
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
Em seguida, aumente o comprimento do tipo de alias.
EXECUTE sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO
CREATE TYPE mytype
FROM NVARCHAR (10);
GO
O parâmetro de função ainda usa o tipo antigo e falha devido ao truncamento.
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
Atualize a função para associar ao tipo renomeado.
EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';
Os parâmetros de função agora estão associados ao tipo correto e a instrução funciona corretamente.
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. Atualizar um gatilho DDL no nível do banco de dados
O exemplo a seguir atualiza um gatilho DDL de nível de banco de dados.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Atualizar um gatilho DDL no nível do servidor
O exemplo a seguir atualiza um gatilho DLL de nível de servidor.
USE master;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO