sp_refreshsqlmodule (Transact-SQL)sp_refreshsqlmodule (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

現在のデータベースの、スキーマにバインドされていない指定のストアドプロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベースレベルの DDL トリガー、またはサーバーレベルの DDL トリガーのメタデータを更新します。Updates the metadata for the specified non-schema-bound stored procedure, user-defined function, view, DML trigger, database-level DDL trigger, or server-level DDL trigger in the current database. これらのオブジェクトの永続メタデータ (パラメーターのデータ型など) は、基になるオブジェクトが変更されたため、古くなる可能性があります。Persistent metadata for these objects, such as data types of parameters, can become outdated because of changes to their underlying objects.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

[ @name = ] 'module\_name'ストアドプロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベースレベルの DDL トリガー、またはサーバーレベルの DDL トリガーの名前を指定します。[ @name = ] 'module\_name' Is the name of the stored procedure, user-defined function, view, DML trigger, database-level DDL trigger, or server-level DDL trigger. module_nameを共通言語ランタイム (clr) ストアドプロシージャまたは clr 関数にすることはできません。module_name cannot be a common language runtime (CLR) stored procedure or a CLR function. module_nameをスキーマバインドにすることはできません。module_name cannot be schema-bound. module_namenvarchar,、既定値はありません。module_name is nvarchar, with no default. module_nameにはマルチパート識別子を指定できますが、参照できるのは現在のデータベース内のオブジェクトだけです。module_name can be a multi-part identifier, but can only refer to objects in the current database.

[ , @namespace = ] ' \<class> 'は、指定されたモジュールのクラスです。[ , @namespace = ] ' \<class> ' Is the class of the specified module. Module_nameが DDL トリガーである場合<は、クラス> が必要です。When module_name is a DDL trigger, <class> is required. クラス>はnvarchar(20) です。 * <*<class> is nvarchar(20). 有効な入力は次のとおりです。Valid inputs are:

DATABASE_DDL_TRIGGERDATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGERSERVER_DDL_TRIGGER 適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.

リターン コードの値Return Code Values

0 (成功) または0以外の数値 (失敗)0 (success) or a nonzero number (failure)

解説Remarks

定義に影響を与えるモジュールの基になるオブジェクトに変更が加えられたときに、 sp_refreshsqlmoduleを実行する必要があります。sp_refreshsqlmodule should be run when changes are made to the objects underlying the module that affect its definition. そうしないと、クエリまたは呼び出されたときに、予期しない結果が生成される可能性があります。Otherwise, the module might produce unexpected results when it is queried or invoked. ビューを更新するには、 sp_refreshsqlmoduleまたはsp_refreshviewを同じ結果で使用できます。To refresh a view, you can use either sp_refreshsqlmodule or sp_refreshview with the same results.

sp_refreshsqlmoduleは、オブジェクトに関連付けられている権限、拡張プロパティ、または SET オプションには影響しません。sp_refreshsqlmodule does not affect any permissions, extended properties, or SET options that are associated with the object.

サーバーレベルの DDL トリガーを更新するには、任意のデータベースのコンテキストからこのストアドプロシージャを実行します。To refresh a server-level DDL trigger, execute this stored procedure from the context of any database.

注意

オブジェクトに関連付けられている署名は、 sp_refreshsqlmoduleを実行すると削除されます。Any signatures that are associated with the object are dropped when you run sp_refreshsqlmodule.

アクセス許可Permissions

モジュールに対する ALTER 権限、およびオブジェクトによって参照される CLR ユーザー定義型と XML スキーマ コレクションに対する REFERENCES 権限が必要です。Requires ALTER permission on the module and REFERENCES permission on any CLR user-defined types and XML schema collections that are referenced by the object. 指定されたモジュールがデータベース レベルの DDL トリガーである場合は、現在のデータベースに対する ALTER ANY DATABASE DDL TRIGGER 権限が必要です。Requires ALTER ANY DATABASE DDL TRIGGER permission in the current database when the specified module is a database-level DDL trigger. 指定されたモジュールがサーバーレベルの DDL トリガーである場合、CONTROL SERVER 権限が必要です。Requires CONTROL SERVER permission when the specified module is a server-level DDL trigger.

さらに、EXECUTE AS 句で定義されているモジュールでは、指定したプリンシパルに対して IMPERSONATE 権限が必要です。Additionally, for modules that are defined with the EXECUTE AS clause, IMPERSONATE permission is required on the specified principal. 通常、オブジェクトを更新しても、モジュールが EXECUTE AS USER を指定して定義された場合を除いて、オブジェクトの EXECUTE AS のプリンシパルは変更されません。プリンシパルのユーザー名は、モジュールが作成された時点とは異なるユーザーに解決されます。Generally, refreshing an object does not change its EXECUTE AS principal, unless the module was defined with EXECUTE AS USER and the user name of the principal now resolves to a different user than that at the time the module was created.

Examples

A.A. ユーザー定義関数の更新Refreshing a user-defined function

次の例では、ユーザー定義関数を更新します。The following example refreshes a user-defined function. この例では、を使用mytype to_upper mytypeする別名データ型、、およびユーザー定義関数を作成します。The example creates an alias data type, mytype, and a user-defined function, to_upper, that uses mytype. mytype次に、をにmyoldtype変更し、別mytypeの定義を持つ新しいを作成します。Then, mytype is renamed to myoldtype, and a new mytype is created that has a different definition. dbo.to_upper関数は、古いものではなく、のmytype新しい実装を参照するように更新されます。The dbo.to_upper function is refreshed so that it references the new implementation of mytype, instead of the old one.

-- Create an alias type.  
USE AdventureWorks2012;  
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.B. データベース レベルの DDL トリガーを更新するRefreshing a database-level DDL trigger

次の例では、データベースレベルの DDL トリガーを更新します。The following example refreshes a database-level DDL trigger.

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

C.C. サーバー レベルの DDL トリガーを更新するRefreshing a server-level DDL trigger

次の例では、サーバーレベルの DDL トリガーを更新します。The following example refreshes a server-level DDL trigger.

適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.
USE master;  
GO  
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';  
GO  
  

参照See Also

sp_refreshview (Transact-sql) sp_refreshview (Transact-SQL)
Transact-sql)(のストアドプロシージャのデータベースエンジンDatabase Engine Stored Procedures (Transact-SQL)