Compartilhar via


sp_refreshsqlmodule (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics (somente pool de SQL dedicado)

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'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. @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_refreshsqlmodule sp_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 do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que pode ser baixado da home page 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.

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.

EXEC 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

EXEC 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

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