Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics (apenas pool SQL dedicado)
Base de dados SQL no Microsoft Fabric
Atualiza os metadados para o procedimento armazenado não limitado a esquema, função definida pelo utilizador, vista, disparador DML, disparador DDL ao nível da base de dados ou disparador DDL ao nível do servidor na base de dados atual. Metadados persistentes para estes objetos, como tipos de dados ou parâmetros, podem ficar desatualizados devido a alterações nos seus objetos subjacentes. Por exemplo, pode ver um erro como The definition for user-defined data type 'typename' has changed. Atualizar os metadados do módulo que utiliza o tipo especificado no erro pode resolver o problema.
Transact-SQL convenções de sintaxe
sp_refreshsqlmodule
[ @name = ] N'name'
[ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]
Arguments
[ @name = ] N'nome'
O nome do procedimento armazenado, função definida pelo usuário, exibição, gatilho DML, gatilho DDL no nível do banco de dados ou gatilho DDL no nível do servidor. @name é nvarchar(776), sem valor padrão. @name não pode ser um procedimento armazenado CLR (Common Language Runtime) ou 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'espaço de nomes'
A classe do módulo especificado.
@namespace é nvarchar(20), com um valor padrão de OBJECT. Quando @name é um gatilho DDL, @namespace é necessário. As entradas válidas são DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.
Valores de código de retorno
0 (sucesso) ou um número diferente de zero (falha).
Observações
sp_refreshsqlmodule deve ser executado quando são feitas alterações aos objetos subjacentes ao módulo que afetam a sua definição. Caso contrário, o módulo pode produzir resultados inesperados quando consultado ou invocado. Para refrescar uma vista, pode usar qualquer um sp_refreshsqlmodule ou sp_refreshview com os mesmos resultados.
sp_refreshsqlmodule não afeta quaisquer permissões, propriedades estendidas ou SET opções associadas ao objeto.
Para atualizar um gatilho DDL no nível do 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 se executa sp_refreshsqlmodule.
Permissions
Requer permissão ALTER no módulo e permissão REFERENCES em qualquer tipo CLR definido pelo utilizador e coleções de esquema XML que o objeto referencia. Requer ALTER ANY DATABASE DDL TRIGGER permissão na base de dados atual quando o módulo especificado é um disparador DDL ao nível da base de dados. Requer CONTROL SERVER permissão quando o módulo especificado é um gatilho DDL a nível de servidor.
Além disso, para módulos definidos com a EXECUTE AS cláusula, IMPERSONATE é necessária permissão no principal especificado. Geralmente, atualizar um objeto não altera o seu EXECUTE AS principal, a menos que o módulo tenha sido definido com EXECUTE AS USER e o nome de utilizador do principal agora se resolva para um utilizador diferente do utilizador na altura em que o módulo foi criado.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
A. Atualizar uma função definida pelo utilizador
O exemplo seguinte atualiza uma função definida pelo utilizador. O exemplo cria um tipo de dado de alias, mytype, e uma função definida pelo utilizador, to_upper, que utiliza mytype. Depois, mytype é renomeado para myoldtype, e é criado um novo mytype com uma definição diferente. A dbo.to_upper função é atualizada para que faça referência à nova implementação de mytype, em vez da antiga.
No primeiro passo, 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
De seguida, aumenta 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 se associar ao tipo renomeado.
EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';
Os parâmetros da função estão agora ligados 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 ao nível da base de dados
O exemplo seguinte atualiza um gatilho DDL ao nível da base de dados.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Atualizar um gatilho DDL ao nível do servidor
O exemplo seguinte atualiza um gatilho DDL ao nível do servidor.
USE master;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO