sp_refreshsqlmodule (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics (専用 SQL プールのみ)
現在のデータベースの指定されたスキーマ バインドされていないストアド プロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベース レベルの DDL トリガー、またはサーバー レベルの DDL トリガーのメタデータを更新します。 これらのオブジェクトの永続的なメタデータ (パラメーターのデータ型など) は、基になるオブジェクトが変更されたため、古くなる可能性があります。 たとえば、 The definition for user-defined data type 'typename' has changed
などのエラーが表示される場合があります。 エラーで指定された型を使用するモジュールのメタデータを更新すると、問題が解決する可能性があります。
構文
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 トリガーである場合は、<class>が必要です。 <class> は nvarchar(20) です。 有効な入力は次のとおりです。
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER - アプリケーション: SQL Server 2008 (10.0.x) 以降。
リターン コードの値
0 (成功) または 0 以外の数値 (失敗)
解説
システム ストアド プロシージャ sp_refreshsqlmodule
は、その定義に影響を与えるモジュールの基になるオブジェクトに変更が加えられたときに実行する必要があります。 そうしないと、モジュールがクエリまたは呼び出されたときに予期しない結果が生成される可能性があります。 ビューを更新するには、同じ結果で sp_refreshsqlmodule
または sp_refreshview
を使用できます。
sp_refreshsqlmodule
は、オブジェクトに関連付けられている権限、拡張プロパティ、または SET オプションには影響しません。
サーバー レベルの DDL トリガーを更新するには、任意のデータベースのコンテキストからこのストアド プロシージャを実行します。
Note
オブジェクトに関連付けられている署名は、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