sp_refreshsqlmodule (Transact-SQL)

現在のデータベースを対象に、指定された非スキーマ バインドのストアド プロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベース レベルの DDL トリガー、またはサーバー レベルの DDL トリガーのメタデータを更新します。これらのオブジェクトに固有のメタデータ (パラメーターのデータ型など) は、基になるオブジェクトを変更すると、古くなる場合があります。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
    [ , [ @namespace = ] ' <class> ' ]

<class> ::=
{
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

引数

  • [ @name= ] 'module_name'
    ストアド プロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベース レベルの DDL トリガー、またはサーバー レベルの DDL トリガーの名前を指定します。module_name には、共通言語ランタイム (CLR) ストアド プロシージャまたは CLR 関数を指定できません。module_name は、スキーマにバインドできません。module_name のデータ型は nvarchar で、既定値はありません。module_name には、複数の要素から構成される識別子を指定できますが、参照できるのは現在のデータベース内のオブジェクトのみです。

  • [ , @namespace = ] ' <class> '
    指定されたモジュールのクラスです。module_name に DDL トリガーを指定した場合、<class> は必須です。有効な入力は、DATABASE_DDL_TRIGGER および SERVER_DDL_TRIGGER です。

    <class> のデータ型は nvarchar(20) です。

リターン コード値

成功した場合は 0 を、失敗した場合は 0 以外の値をそれぞれ返します。

説明

その定義に影響するモジュールの基になるオブジェクトに対して変更が行われたときに、sp_refreshsqlmodule を実行する必要があります。この操作を行わないと、モジュールにクエリを実行したりオブジェクトを呼び出したときに、予期しない結果が生じる可能性があります。ビューを更新するには、sp_refreshsqlmodule または sp_refreshview を使用できます。この 2 つは同じ結果を返します。

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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO

C. サーバー レベルの DDL トリガーを更新する

次の例では、サーバー レベルの DDL トリガーを更新します。

USE master;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';
GO