sp_refreshsqlmodule (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure 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

Sintaxis

sys.sp_refreshsqlmodule [ @name = ] 'module_name'   
    [ , [ @namespace = ] ' <class> ' ]  
  
<class> ::=  
{  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  
  

Argumentos

@name

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

@namespace

Es la clase del módulo especificado. Cuando module_name es un desencadenador DDL, <se requiere la clase> . <la clase> es nvarchar(20). Las entradas válidas son:

  • DATABASE_DDL_TRIGGER

  • SERVER_DDL_TRIGGER: se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

Valores de código de retorno

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

Comentarios

El procedimiento sp_refreshsqlmodule almacenado del sistema 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 producir resultados inesperados cuando se consulta o se invoca. Para actualizar una vista, puede usar o sp_refreshsqlmodulesp_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 permiso ALTER ANY DATABASE DDL TRIGGER en la base de datos actual cuando el módulo especificado es un desencadenador DDL de nivel de base de datos. Requiere el permiso CONTROL SERVER cuando el módulo especificado es un desencadenador DDL de nivel de servidor.

Además, en los módulos definidos con la cláusula EXECUTE AS, es necesario el permiso IMPERSONATE en la entidad de seguridad especificada. Generalmente, al actualizar un objeto no se cambia su entidad de seguridad EXECUTE AS, a menos que el módulo se defina con EXECUTE AS USER y el nombre de usuario de la entidad de seguridad se resuelva ahora como un usuario diferente del usado en el momento en que se creó el módulo.

Ejemplos

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. Entonces, el nombre de mytype se cambia a myoldtype, y se crea un nuevo mytype que tiene 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.

-- Create an alias type.  
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  
  
-- Increase the length of the alias type.  
sp_rename 'mytype', 'myoldtype', 'userdatatype';  
GO  
  
CREATE TYPE mytype FROM nvarchar(10);  
GO  
  
-- The function parameter still uses the old type.  
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  
  
-- Refresh the function to bind to the renamed type.  
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';  
  
-- The function parameters are now bound to the correct type and the statement works correctly.  
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. Actualizar un desencadenador DDL de nivel de la 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. Actualizar un desencadenador DDL de nivel de servidor

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

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores.

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

Pasos siguientes