ユーザー定義型の実装

更新 : 2006 年 4 月 14 日

このトピックでは、SQL Server で共通言語ランタイム (CLR) ユーザー定義型を作成および削除する方法について説明します。

ユーザー定義型の作成

SQL Server でユーザー定義型を作成するには、次の手順を順番に実行する必要があります。

  • ユーザー定義型を Microsoft .NET Framework でサポートされる言語のクラスまたは構造として定義します。CLR での型のプログラミング方法の詳細については、「CLR ユーザー定義型」を参照してください。次に、適切な言語コンパイラを使用してクラスまたは構造をコンパイルし、.NET Framework のアセンブリをビルドします。
  • CREATE ASSEMBLY ステートメントを使用して、SQL Server にアセンブリを登録します。SQL Server のアセンブリの詳細については、「アセンブリ (データベース エンジン)」を参照してください。
  • 登録したアセンブリを参照する型を作成します。
ms179298.note(ja-jp,SQL.90).gifメモ :
Microsoft Visual Studio で SQL Server プロジェクトを配置すると、そのプロジェクトで指定されたデータベース内のアセンブリが登録されます。また、プロジェクトを配置することで、SqlUserDefinedType 属性で注釈が付けられたすべてのクラス定義に対応する CLR ユーザー データ型がデータベースに作成されます。詳細については、「CLR データベース オブジェクトの配置」を参照してください。
ms179298.note(ja-jp,SQL.90).gifメモ :
既定では、CLR コードを実行する SQL Server の機能は無効になっています。マネージ コード モジュールを参照するデータベース オブジェクトを作成、変更、および削除できますが、それらの参照を SQL Server で実行するには、sp_configure を使用して clr enabled オプションを有効にする必要があります。

アセンブリを作成、変更、または削除するには

ユーザー定義型を作成するには

ユーザー定義型の削除

ユーザー定義型を削除するには

ms179298.note(ja-jp,SQL.90).gifメモ :
作成したユーザー定義型を変更すると、テーブルのデータまたはインデックスが無効になる場合があるので、ユーザー定義型を作成後に変更することはできません。型を変更するには、型を削除して再作成するか、WITH UNCHECKED DATA 句を使用して ALTER ASSEMBLY ステートメントを実行する必要があります。

削除する型へのすべての参照が削除されるまでは、ユーザー定義型を削除できません。これらの参照には、次のようなものがあります。

  • 型で定義された列。
  • 型を参照する式を持つ計算列および CHECK 制約。
  • 定義内の式で型を参照するスキーマ バインド ビューおよびスキーマ バインド関数。
  • 関数とストアド プロシージャのパラメータ。

ユーザー定義型に依存する列を検索するには

次の例では、ユーザー定義型 ComplexNumber で定義された列のメタデータを取得します。

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

次の例では、ユーザー定義型 ComplexNumber で定義された列に関する、最も特権の少ないユーザー用に制限したメタデータを取得します。

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

ユーザー定義型に依存する計算列の式、CHECK 制約の式、およびスキーマ バインド ビューとスキーマ バインド関数の式を検索するには

次の例では、ユーザー定義型 ComplexNumber に依存する計算列 (およびそのテーブル) の名前を取得します。

SELECT OBJECT_NAME(object_id) AS object_name,
    COL_NAME(object_id, column_id) AS column_name
FROM sys.sql_dependencies
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
    AND class = 2 
    AND OBJECTPROPERTY(object_id, 'IsTable')=1; 

次の例では、ユーザー定義型 ComplexNumber に依存する CHECK 制約 (および CHECK 制約が定義されるオブジェクト) の名前を取得します。

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.object_id
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
AND class = 2 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

次の例では、ユーザー定義型 ComplexNumber への参照を含む定義を持つ、スキーマ バインド関数とスキーマ バインド ビューの名前を取得します。

ms179298.note(ja-jp,SQL.90).gifメモ :
SQL Server では、ユーザー定義型と、ストアド プロシージャ、トリガ、非スキーマ バインド関数または非スキーマ バインド ビュー本体でのユーザー定義型の使用方法との依存関係に関するメタデータを保持しません。
SELECT SCHEMA_NAME(o.schema_id) AS dependent_object_schema,
    OBJECT_NAME(o.object_id) AS dependent_object_name,
    o.type_desc AS dependent_object_type,
    d.class_desc AS kind_of_dependency,
    d.referenced_major_id AS referenced_object
FROM sys.sql_dependencies AS d 
JOIN sys.objects AS o
    ON d.object_id = o.object_id
        AND o.type IN ('FN','IF','TF', 'V')
WHERE  d.class = 2
    AND d.referenced_major_id IN (TYPE_ID('ComplexNumber'))
ORDER BY dependent_object_schema, dependent_object_name;

ユーザー定義型に依存するパラメータを検索するには

次の例では、ユーザー定義型 ComplexNumber で定義されたパラメータ (およびパラメータが所属するオブジェクト) の名前を取得します。

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

次の例では、ユーザー定義型 ComplexNumber で定義されたパラメータに関する、最も特権の少ないユーザー用に制限したメタデータを取得します。

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

参照

概念

CLR ユーザー定義型の使用

その他の技術情報

CLR プログラミング サンプル

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 4 月 14 日

新しい内容 :
  • ユーザー定義型の依存関係の特定に関する情報を含めた「ユーザー定義型の削除」を追加しました。