Compartir a través de


sp_refreshsqlmodule (Transact-SQL)

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.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
    [ , [ @namespace = ] ' <class> ' ]

<class> ::=
{
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

Argumentos

  • [ @name= ] 'module_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 ni una función CLR (Common Language Runtime). module_name no puede estar enlazado al esquema. module_name es de tipo nvarchar y no tiene ningún valor predeterminado. module_name puede ser un identificador de varias partes, pero solo puede hacer referencia a los objetos de la base de datos actual.

  • [ , @namespace = ] ' <class> '
    Es la clase del módulo especificado. Cuando module_name es un desencadenador DDL, se requiere <class>. Las entradas válidas son DATABASE_DDL_TRIGGER y SERVER_DDL_TRIGGER.

    <class> es de tipo nvarchar(20).

Valores de código de retorno

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

Comentarios

sp_refreshsqlmodule se debería ejecutar cuando se realizan cambios en los objetos subyacentes del módulo que afecta 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 sp_refreshsqlmodule o sp_refreshview con los mismos resultados.

sp_refreshsqlmodule no afecta a ningún permiso, propiedad extendida u opción SET que esté asociado 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 anulan 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 AdventureWorks2012;
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 AdventureWorks2012;
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.

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

Vea también

Referencia

sp_refreshview (Transact-SQL)

Procedimientos almacenados del motor de base de datos (Transact-SQL)