sp_refreshsqlmodule (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics (僅限專用 SQL 集區)

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

Transact-SQL 語法慣例

語法

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

引數

@name

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

@namespace

這是指定模組的類別。 當module_name是 DDL 觸發程式時,<則需要 類別>。 <類別>nvarchar(20)。 有效輸入包括:

  • DATABASE_DDL_TRIGGER

  • SERVER_DDL_TRIGGER - 適用於:SQL Server 2008 (10.0.x) 和更新版本。

傳回碼值

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 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. 重新整理資料庫層級 DDL 觸發程式

下列範例會重新整理資料庫層級 DDL 觸發程式。

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

C. 重新整理伺服器層級 DDL 觸發程式

下列範例會重新整理伺服器層級 DDL 觸發程式。

適用於:SQL Server 2008 (10.0.x) 和更新版本。

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

下一步