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_nameは nvarchar で、既定値はありません。 module_name はマルチパート識別子にできますが、現在のデータベース内のオブジェクトのみを参照できます。

@namespace

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

  • DATABASE_DDL_TRIGGER

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

リターン コードの値

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

解説

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

sp_refreshsqlmoduleは、オブジェクトに関連付けられている権限、拡張プロパティ、またはStandard Edition T オプションには影響しません。

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

Note

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

アクセス許可

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

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

A. ユーザー定義関数の更新

次の例では、ユーザー定義関数を更新します。 この例では、エイリアス データ型と、mytypeユーザー定義関数to_uppermytypeを作成します。 その後、 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  

次のステップ