共用方式為


sp_refreshsqlmodule (Transact-SQL)

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics (僅適用於專用 SQL 集區)

更新指定之非架構系結預存程式的元數據、使用者定義函數、檢視、DML 觸發程式、資料庫層級 DDL 觸發程式,或目前資料庫中的伺服器層級 DDL 觸發程式。 這些對象的持續性元數據,例如參數的數據類型,可能會因為基礎對象的變更而過時。 例如,您可能會看到類似的錯誤 The definition for user-defined data type 'typename' has changed。 重新整理使用錯誤中所指定類型的模組元數據,可能會解決問題。

Transact-SQL 語法慣例

sp_refreshsqlmodule
    [ @name = ] N'name'
    [ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]

引數

[ @name = ] N'name'

預存程序、使用者自訂函數、檢視、DML 觸發程序、資料庫層級 DDL 觸發程序或伺服器層級 DDL 觸發程序的名稱。 @namenvarchar(776),沒有預設值。 @name 不能是 Common Language Runtime (CLR) 預存程序或 CLR 函數。 @name 不能是結構描述繫結。 @name 可以是多部分組成的識別碼,但只能參考目前資料庫中的物件。

[ @namespace = ] N'namespace'

指定模組的類別。 @namespacenvarchar(20),預設值為 OBJECT。 當 @name 是 DDL 觸發程序時,則需要 @namespace。 有效輸入為 DATABASE_DDL_TRIGGERSERVER_DDL_TRIGGER

傳回碼值

0 (成功) 或非零數字 (失敗)。

備註

sp_refreshsqlmodule 應該在對影響其定義之模組基礎的對象進行變更時執行。 否則,當查詢或叫用模組時,可能會產生非預期的結果。 若要重新整理檢視,您可以使用 sp_refreshsqlmodulesp_refreshview 搭配相同的結果。

sp_refreshsqlmodule 不會影響與物件相關聯的任何權限、擴充屬性或 SET 選項。

若要重新整理伺服器層級 DDL 觸發程序,請從任何資料庫的內容執行此預存程序。

注意

當您執行 sp_refreshsqlmodule 時,會卸除與物件相關聯的任何簽章。

權限

需要模組的 ALTER 權限,以及物件所參考的任何 CLR 使用者定義型別和 XML 結構描述集合的 REFERENCES 權限。 ALTER ANY DATABASE DDL TRIGGER當指定的模組是資料庫層級 DDL 觸發程式時,需要目前資料庫中的許可權。 CONTROL SERVER當指定的模組是伺服器層級 DDL 觸發程式時,需要許可權。

此外,對於使用 EXECUTE AS 子句定義的模組, IMPERSONATE 需要指定主體的許可權。 一般而言,除非已使用 定義EXECUTE AS USER模組,而且主體的使用者名稱現在解析為與模組建立時使用者不同的使用者,否則重新整理物件不會變更其EXECUTE AS主體。

範例

本文 Transact-SQL 程式碼範例使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。

A. 重新整理使用者定義函式

下列範例會重新整理使用者定義函式。 此範例會建立別名數據類型,mytype以及使用mytype的使用者定義函數to_upper。 然後, mytype 會重新命名為 myoldtype,並建立新的 mytype ,這是不同的定義。 函 dbo.to_upper 式會重新整理,以便參考 的新實 mytype作,而不是舊實作。

在第一個步驟中,建立別名類型。

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

接下來,增加別名類型的長度。

sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype FROM NVARCHAR(10);
GO

函式參數仍然使用舊類型,而且因為截斷而失敗。

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

重新整理函式以系結至重新命名的類型。

EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';

函式參數現在系結至正確的型別,而語句正常運作。

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 AdventureWorks2022;
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