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 myoldtype
y 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