Compartir a través de


sp_refreshsqlmodule (Transact-SQL)

Se aplica a: SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics (solo grupo de SQL dedicado)

Actualiza los metadatos para el procedimiento almacenado no enlazado a un esquema específico, función definida por el usuario, vista, desencadenador DML, desencadenador DDL de nivel de la base de datos o desencadenador DDL de nivel de servidor en la base de datos actual. Los metadatos persistentes de estos objetos, como los tipos de datos de los parámetros, pueden quedarse obsoletos debido a los cambios en sus objetos subyacentes. Por ejemplo, podría ver un error como The definition for user-defined data type 'typename' has changed. Actualizar los metadatos del módulo que usa el tipo especificado en el error podría resolver el problema.

Convenciones de sintaxis de Transact-SQL

sp_refreshsqlmodule
    [ @name = ] N'name'
    [ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]

Argumentos

[ @name = ] N'name'

Nombre del procedimiento almacenado, la función definida por el usuario, la vista, el desencadenador DML, el desencadenador DDL de nivel de base de datos o el desencadenador DDL de nivel de servidor. @name es nvarchar(776), sin ningún valor predeterminado. @name no puede ser un procedimiento almacenado de Common Language Runtime (CLR) ni una función CLR. @name no se puede enlazar al esquema. @name puede ser un identificador de varias partes, pero solo puede hacer referencia a objetos de la base de datos actual.

[ @namespace = ] N'namespace'

La clase del módulo especificado. @namespace es nvarchar(20), con un valor predeterminado de OBJECT. Cuando @name es un desencadenador DDL, es necesario @namespace. Las entradas válidas son DATABASE_DDL_TRIGGER y SERVER_DDL_TRIGGER.

Valores de código de retorno

0 (correcto) o un número distinto de cero (error).

Comentarios

sp_refreshsqlmodule debe ejecutarse cuando se realizan cambios en los objetos subyacentes al módulo que afectan a su definición. De lo contrario, el módulo podría generar resultados inesperados cuando se consultan o invocan. Para actualizar una vista, puede usar o sp_refreshsqlmodule sp_refreshview con los mismos resultados.

sp_refreshsqlmodule no afecta a ningún permiso, propiedades extendidas ni opciones SET asociadas al objeto.

Para actualizar un desencadenador DDL de nivel de servidor, ejecute este procedimiento almacenado desde el contexto de cualquier base de datos.

Nota:

Las firmas asociadas al objeto se quitan al ejecutar sp_refreshsqlmodule.

Permisos

Requiere el permiso ALTER en el módulo y el permiso REFERENCES en cualquier tipo definido por el usuario CLR y las colecciones de esquemas XML a los que hace referencia el objeto. Requiere ALTER ANY DATABASE DDL TRIGGER permiso en la base de datos actual cuando el módulo especificado es un desencadenador DDL de nivel de base de datos. Requiere CONTROL SERVER permiso cuando el módulo especificado es un desencadenador DDL de nivel de servidor.

Además, para los módulos definidos con la EXECUTE AS cláusula , IMPERSONATE se requiere el permiso en la entidad de seguridad especificada. Por lo general, la actualización de un objeto no cambia su EXECUTE AS entidad de seguridad, a menos que el módulo se haya definido con EXECUTE AS USER y el nombre de usuario de la entidad de seguridad ahora se resuelve en un usuario diferente del usuario en el momento en que se creó el módulo.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se puede descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

A Actualizar una función definida por el usuario

En el ejemplo siguiente se actualiza una función definida por el usuario. En el ejemplo se crea un tipo de datos de alias, mytype, y una función definida por el usuario, to_upper, que usa mytype. A continuación, mytype se cambia el nombre a myoldtypey se crea un nuevo mytype que es una definición diferente. La función dbo.to_upper se actualiza para que haga referencia a la nueva implementación de mytype, en lugar de a la antigua.

En el primer paso, cree un 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

A continuación, aumente la longitud del tipo de alias.

sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype FROM NVARCHAR(10);
GO

El parámetro de función sigue usando el tipo antiguo y se produce un error debido al truncamiento.

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

Actualice la función para enlazar al tipo cuyo nombre ha cambiado.

EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';

Los parámetros de función ahora están enlazados al tipo correcto y la instrucción funciona correctamente.

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. Actualización de un desencadenador DDL de nivel de base de datos

El ejemplo siguiente actualiza un desencadenador DDL de nivel de la base de datos.

USE AdventureWorks2022;
GO

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

C. Actualización de un desencadenador DDL de nivel de servidor

El ejemplo siguiente actualiza un desencadenador DDL de nivel de servidor.

USE master;
GO

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