Share via


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 不能是 Common Language Runtime (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_refreshsqlmodulesp_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