sp_refreshsqlmodule (Transact-SQL)
新規 : 2006 年 12 月 12 日
指定された非スキーマ バインド ストアド プロシージャ、ユーザー定義関数、またはビューのメタデータを更新します。これらのオブジェクトに固有のメタデータ (パラメータのデータ型など) は、基になるオブジェクトを変更すると、古くなる場合があります。
構文
sp_refreshsqlmodule [ @name = ] 'module_name'
引数
- [ @name= ] 'module_name'
ストアド プロシージャ、関数、またはビューの名前を指定します。module_name には、共通言語ランタイム (CLR) ストアド プロシージャまたは CLR 関数を指定できません。module_name は、スキーマにバインドできません。module_name のデータ型は nvarchar で、既定値はありません。module_name には、複数の要素から構成される識別子を指定できますが、参照できるのは現在のデータベース内のオブジェクトのみです。
解説
その定義に影響するストアド プロシージャ、ユーザー定義関数、またはビューの基になるオブジェクトに対して変更が行われたときに、sp_refreshsqlmodule を実行する必要があります。この操作を行わないと、オブジェクトにクエリを実行したりオブジェクトを呼び出したときに、予期しない結果が生じる可能性があります。ビューを更新するには、sp_refreshsqlmodule または sp_refreshview を使用できます。この 2 つは同じ結果を返します。
sp_refreshsqlmodule は、オブジェクトに関連付けられている権限、拡張プロパティ、または SET オプションに影響しません。
オブジェクトに関連付けられている署名は、sp_refreshsqlmodule の実行時に削除されます。
権限
ストアド プロシージャ、関数、またはビューに対する ALTER 権限、およびオブジェクトによって参照される CLR ユーザー定義型と XML スキーマ コレクションに対する REFERENCES 権限が必要です。
さらに、EXECUTE AS 句で定義されているモジュールでは、指定したプリンシパルに対して IMPERSONATE 権限が必要です。通常、オブジェクトを更新しても、モジュールが EXECUTE AS USER を指定して定義された場合を除いて、オブジェクトの EXECUTE AS のプリンシパルは変更されません。プリンシパルのユーザー名は、モジュールが作成された時点とは異なるユーザーに解決されます。
戻り値
成功した場合は 0 を、失敗した場合は 0 以外の値をそれぞれ返します。
例
次の例では、ユーザー定義関数を更新します。この例では、別名データ型 mytype
、および mytype
を使用するユーザー定義関数 to_upper
が作成されます。その後、mytype
の名前が myoldtype
に変更され、異なる定義を持つ新しい mytype
が作成されます。to_upper
関数は、mytype
の古い実装ではなく新しい実装を参照するように更新されます。
-- Create an alias type.
USE AdventureWorks;
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 ('to_upper', 'FN') IS NOT NULL
DROP FUNCTION to_upper;
GO
CREATE FUNCTION 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
参照
関連項目
sp_refreshview (Transact-SQL)
データベース エンジンのストアド プロシージャ (Transact-SQL)