sp_refreshsqlmodule (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure 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 は、共通言語ランタイム (CLR) ストアド プロシージャまたは CLR 関数にすることはできません。 module_name はスキーマバインドできません。 module_namenvarchar で、既定値はありません。 module_name はマルチパート識別子にすることができますが、現在のデータベース内のオブジェクトのみを参照できます。

@namespace

指定したモジュールのクラスです。 module_nameが DDL トリガーの場合は、 <クラス>が必要です。 <クラス>nvarchar(20) です。 有効な入力は次のとおりです。

  • DATABASE_DDL_TRIGGER

  • SERVER_DDL_TRIGGER - 適用対象: SQL Server 2008 (10.0.x) 以降。

リターン コードの値

0 (成功) または 0 以外の数値 (失敗)

注釈

システム ストアド プロシージャ sp_refreshsqlmodule は、その定義に影響を与えるモジュールの基になるオブジェクトに変更が加えられたときに実行する必要があります。 それ以外の場合、モジュールのクエリまたは呼び出し時に予期しない結果が生成される可能性があります。 ビューを更新するには、同じ結果で または sp_refreshview を使用sp_refreshsqlmoduleできます。

sp_refreshsqlmodule は、オブジェクトに関連付けられているアクセス許可、拡張プロパティ、または SET オプションには影響しません。

サーバー レベルの DDL トリガーを更新するには、任意のデータベースのコンテキストからこのストアド プロシージャを実行します。

注意

を実行 sp_refreshsqlmoduleすると、オブジェクトに関連付けられているすべての署名が削除されます。

アクセス許可

モジュールに対する ALTER 権限、およびオブジェクトによって参照される CLR ユーザー定義型と XML スキーマ コレクションに対する REFERENCES 権限が必要です。 指定されたモジュールがデータベース レベルの DDL トリガーである場合は、現在のデータベースに対する ALTER ANY DATABASE DDL TRIGGER 権限が必要です。 指定したモジュールがサーバー レベルの DDL トリガーである場合は、CONTROL SERVER 権限が必要です。

さらに、EXECUTE AS 句で定義されているモジュールでは、指定したプリンシパルに対して IMPERSONATE 権限が必要です。 通常、オブジェクトを更新しても、モジュールが EXECUTE AS USER を指定して定義された場合を除いて、オブジェクトの EXECUTE AS のプリンシパルは変更されません。プリンシパルのユーザー名は、モジュールが作成された時点とは異なるユーザーに解決されます。

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  

次のステップ