次の方法で共有


複数のデータベース間でのユーザー定義型の使用

ユーザー定義型を作成すると、その型は 1 つのデータベースに対するローカルな型になります。したがって、あるデータベースで定義したユーザー定義型は、別のデータベースの列定義では使用できません。ただし、2 つのデータベースで同じユーザー定義型が登録されいて、アクセスできる場合は、一方のデータベースのユーザー定義型の値を変換して、もう一方のデータベースでその値を使用することができます。この機能は、次の場合に役立ちます。

  • 別のデータベースで定義されているストアド プロシージャを呼び出す場合。

  • 異なる 2 つのデータベースで定義されているテーブルに対してクエリを実行する場合。

  • あるデータベースからデータを選択して、そのデータを別のデータベースに挿入する場合。

たとえば、ユーザー定義型 u1 が、データベース db1 とデータベース db2 の両方で作成されているとします。ストアド プロシージャ p2 は、データベース db2 だけに作成されており、u1 型のパラメータを受け取ります。ストアド プロシージャ p2 は、データベース db1 の u1 型のインスタンスを使用して呼び出せます。

USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO

今度は、tempdb の一時テーブルにクエリの結果を格納するとします。この操作を成功させるには、ユーザー定義型を tempdb に登録する必要があります。

INSERT INTO #t SELECT * FROM T 

ユーザー定義型をテーブル変数で使用している場合、または作業テーブルでカーソルがユーザー定義型を使用している場合は、tempdb にユーザー定義型を登録する必要はありません。

ユーザー定義型を複数のデータベースで使用する場合は、次のことを覚えておく必要があります。

  • 型の名前 (CLR 名を含む) を同じ名前にする必要があります。また、両方のデータベースで同じアセンブリを使用して実装されている必要があります。名前、厳密な名前、カルチャ、バージョン、コード アクセス権セット、およびバイナリの内容が同じ場合は、2 つのデータベースのアセンブリは同一であると言えます。

  • クエリで参照する各ユーザー定義型の列に対し、SELECT 権限と EXECUTE 権限を持っている必要があります。これらの権限は、各列を定義しているデータベースに対して確認されます。

  • あるアセンブリで実装されている型から別のアセンブリのメソッドが呼び出されると、そのアセンブリ間の呼び出しは、ユーザー定義型クエリが 1 つのデータベースに対してのみ発行された場合と同様に検証されます。