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 トリガーの場合は、 <クラス>が必要です。 <クラス> は 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
次のステップ
フィードバック
フィードバックの送信と表示