Compartilhar via


sp_refreshsqlmodule (Transact-SQL)

Aplica-se a:SQL ServerBanco 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