sp_refreshsqlmodule (Transact-SQL)

更新当前数据库中指定的非绑定到架构的存储过程、用户定义函数、视图、DML 触发器、数据库级 DDL 触发器或服务器级 DDL 触发器的元数据。如果更改这些对象的基础对象,则这些对象的持久元数据(如参数的数据类型)将会过时。

主题链接图标Transact-SQL 语法约定

语法

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

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

参数

  • [ @name= ] 'module_name'
    是存储过程、用户定义函数、视图、DML 触发器、数据库级 DDL 触发器或服务器级 DDL 触发器的名称。module_name 不能是公共语言运行时 (CLR) 存储过程或 CLR 函数。module_name 不能是绑定到架构的。module_name 的数据类型为 nvarchar,无默认值。module_name 可以是由多部分组成的标识符,但只能引用当前数据库中的对象。

  • [ , @namespace = ] ' <class> '
    是指定模块的类。当 module_name 为 DDL 触发器时,<class> 是必需的。有效的输入为 DATABASE_DDL_TRIGGER 和 SERVER_DDL_TRIGGER。

    <class> 的数据类型为 nvarchar(20)。

返回代码值

0(成功)或非零数字(失败)

注释

对模块所基于的对象(影响模块的定义)进行更改时,应运行 sp_refreshsqlmodule。否则,查询或调用该模块时,可能会产生意外结果。若要刷新视图,可以使用 sp_refreshsqlmodule 或具有相同效果的 sp_refreshview

sp_refreshsqlmodule 不会影响与对象关联的任何权限、扩展属性或 SET 选项。

若要刷新服务器级 DDL 触发器,可以在任何数据库的上下文中执行此存储过程。

注意注意

运行 sp_refreshsqlmodule 时,将删除与对象关联的所有签名。

权限

需要对相应模块拥有 ALTER 权限,对该对象引用的任何 CLR 用户定义类型和 XML 架构集合拥有 REFERENCES 权限。当指定的模块是数据库级 DDL 触发器时,需要在当前数据库中拥有 ALTER ANY DATABASE DDL TRIGGER 权限。当指定的模块是服务器级 DDL 触发器时,需要拥有 CONTROL SERVER 权限。

此外,对于使用 EXECUTE AS 子句定义的模块,要求对指定主体拥有 IMPERSONATE 权限。通常,刷新对象不会更改其 EXECUTE AS 主体,除非模块是使用 EXECUTE AS USER 定义的,并且主体的用户名现在解析为与创建模块时的用户不同的用户。

示例

A. 刷新用户定义函数

以下示例刷新用户定义函数。此示例创建别名数据类型 mytype 和使用 mytype 的用户定义函数 to_upper。然后,mytype 将重命名为 myoldtype,并将创建具有不同定义的 mytype。刷新了 dbo.to_upper 函数,以使它引用 mytype 的新实现,而非其旧实现。

-- Create an alias type.
USE AdventureWorks;
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. 刷新数据库级 DDL 触发器

下例刷新一个数据库级 DDL 触发器。

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

C. 刷新服务器级 DDL 触发器

下例刷新一个服务器级 DDL 触发器。

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