チュートリアル: カスタム データ ジェネレータの作成
データベース スキーマを開発するとき、できる限り本番データに近いデータを使用してテスト データベースを作成することで、提示された変更を、より効果的にテストできます。 カスタム データ ジェネレータは、組み込みのデータ ジェネレータよりも厳密に仕様を満たすテスト データを提供します。 たとえば、指定したリストからランダムな文字列を使用したり、指定した範囲内の数字を使用したりして、テーブルの列にデータを読み込むジェネレータを作成できます。 詳細については、「データ ジェネレータ機能拡張の概要」を参照してください。
このトピックの一連の操作手順では、ランダムなアドレス文字列を生成するカスタム データ ジェネレータを作成します。 このチュートリアルでは、次のタスクを行います。
Generator を継承するカスタム アドレス データ ジェネレータのクラス ライブラリを作成します。
ジェネレータ出力として使用する出力プロパティを追加します。
OnGenerateNextValues メソッドをオーバーライドして、データを生成します。
ジェネレータ アセンブリに署名します。
登録に使用されるアセンブリに関連付けられた XML ファイルを作成します。
データベース プロジェクトとデータ生成計画を作成して、カスタム データ ジェネレータをテストします。
前提条件
このチュートリアルを完了するには、Visual Studio Team System Database Edition または Visual Studio Team System がインストールされている必要があります。
カスタム ジェネレータのクラス ライブラリの作成
最初にカスタム アドレス データ ジェネレータのクラス ライブラリを作成します。
カスタム ジェネレータのクラス ライブラリを作成するには
Visual C# クラス ライブラリ プロジェクトを作成し、SampleGenerator という名前を付けます。
ソリューション エクスプローラで、プロジェクトを右クリックし、[参照の追加] をクリックします。
[.NET] タブをクリックします。
[コンポーネント名] 列で、次のコンポーネントを選択します。
ヒント : 複数のコンポーネントを選択するには、Ctrl キーを押しながらコンポーネントをクリックします。
必要なすべてのコンポーネントを選択したら、[OK] をクリックします。
ソリューション エクスプローラで、選択した参照がプロジェクトの [参照設定] ノードの下に表示されます。
[コード] ウィンドウの一番上のクラス宣言の前に、次のコード行を追加します。
using Microsoft.Data.Schema.DataGenerator; using Microsoft.Data.Schema.Extensibility; using Microsoft.Data.Schema.Sql.SqlDsp;
クラス名を Class1 から AddressGenerator に変更します。
注意 : 既定では、クラス名として指定した名前は、[列の詳細] ウィンドウの [ジェネレータ] 列の一覧に表示されます。 組み込みのジェネレータや他のカスタム ジェネレータの名前と競合しない名前を指定してください。
public class AddressGenerator { }
次の例に示すように、Generator からのクラスの継承を指定します。
public class AddressGenerator : Generator { }
次の例に示すように、DatabaseSchemaProviderCompatibilityAttribute を追加します。
[DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))] public class AddressGenerator : Generator { }
拡張機能互換性属性の詳細については、「Database Edition の機能の拡張」を参照してください。
[ファイル] メニューの [すべてを保存] をクリックします。
ジェネレータへの出力プロパティの追加
前のセクションでは、Generator クラスを継承するクラス ライブラリを作成しました。 このセクションでは、出力プロパティをクラスに追加します。 出力プロパティには、生成されたデータの値を指定します。 出力プロパティは、このジェネレータで生成できるデータの種類も指定します。
出力プロパティを追加するには
次の例に示すように、アドレスの生成に使用されるメンバ変数を作成します。
出力プロパティについての後の手順では、_address 変数を使用します。
private Random _random; private string _street; private string _city; private string _state; private int _zipCode; private string _address; private static readonly List<String> _states = new List<string>() { "AK", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" };
次の例に示すように、_random メンバ変数のプライベート プロパティを作成します。
private Random Random { get { if (_random == null) _random = new Random(base.Seed); return _random; } }
次の例に示すように、_address メンバ変数のパブリック プロパティを作成し、OutputAttribute を追加します。
[Output(Description = "Generates street and city values of \"2150 Newton Street, San Francisco\", with random state and zip code.", Name = "Address")] public string Address { get { return this._address; } }
[ファイル] メニューの [すべてを保存] をクリックします。
OnGenerateNextValues メソッドのオーバーライド
Visual Studio Team Edition for Database Professionals は、必要とする一連の値ごとに各ジェネレータの OnGenerateNextValues メソッドを呼び出します。 データ ジェネレータを作成する場合、このメソッドをオーバーライドして、出力プロパティのそれぞれに対して値を生成するロジックを指定する必要があります。
OnGenerateNextValues メソッドをオーバーライドするには
次の例に示すように、OnGenerateNextValues メソッドをオーバーライドします。
protected override void OnGenerateNextValues() { this._street = "2150 Newton Street"; this._city = "San Francisco"; this._state = _states[Random.Next(0, _states.Count)]; this._zipCode = Int32.Parse(String.Format("{0}{1}{2}{3}{4}", GetRandomDigit(1), GetRandomDigit(), GetRandomDigit(), GetRandomDigit(), GetRandomDigit())); this._address = String.Format("{0}, {1}, {2} {3}", _street, _city, _state, _zipCode); }
次のメソッドを使用します。このメソッドは、_zipcode 変数の値の作成に使用されます。
private int GetRandomDigit() { return GetRandomDigit(0); } private int GetRandomDigit(int lowNumber) { return Random.Next(lowNumber, 10); }
[ファイル] メニューの [すべてを保存] をクリックします。
ジェネレータへの署名
次に、カスタム データ ジェネレータに厳密な名前で署名する必要があります。
ジェネレータに厳密な名前で署名するには
[プロジェクト] メニューの [SampleGenerator のプロパティ] をクリックします。
[署名] タブの [アセンブリの署名] チェック ボックスをオンにします。
[厳密な名前のキー ファイルを選択してください] ボックスの一覧の [<新規作成...>] をクリックします。
[厳密な名前キーの作成] ダイアログ ボックスが表示されます。
[キー ファイル] ボックスに「SampleGeneratorKey」と入力します。
パスワードとパスワードの確認を入力し、[OK] をクリックします。
ソリューションをビルドすると、このキー ファイルを使ってアセンブリが署名されます。
[ファイル] メニューの [すべてを保存] をクリックします。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
これで、カスタム データ ジェネレータが作成されました。
ジェネレータ アセンブリの登録
アセンブリの署名とコンパイルが完了したら、ジェネレータ アセンブリの登録を円滑に進めるため、プロジェクト内で生成されたアセンブリ情報 (バージョン、カルチャ、PublicKeyToken など) を収集します。
アセンブリ情報を収集するには
[表示] メニューの [その他のウィンドウ] をクリックし、[コマンド ウィンドウ] をクリックして、[コマンド] ウィンドウを開きます。
[コマンド] ウィンドウに、次のコードを入力します。FilePath をコンパイル済みの .dll ファイルのパスとファイル名に置き換えます。パスとファイル名は引用符で囲みます。
メモ : 既定では、コンパイル済みの .dll ファイルのパスは SampleGenerator\bin\Debug です。
? System.Reflection.Assembly.LoadFrom(@"<FilePath>").FullName
Enter キーを押します。 具体的な PublicKeyToken の値を含む次のような行が表示されます。
" SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
このアセンブリ情報をメモするか、コピーします。この情報は次の手順で使用します。
次に、前の手順で収集したアセンブリ情報を使用して XML ファイルを作成します。
XML ファイルを作成するには
ソリューション エクスプローラで SampleGenerator プロジェクトを選択します。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[テンプレート] ペインで、[XML ファイル] という項目を探してクリックします。
[名前] ボックスに「SampleGenerator.Extensions.xml」と入力し、[追加] をクリックします。
ソリューション エクスプローラで SampleGenerator.Extensions.xml ファイルがプロジェクトに追加されます。
メモ : 登録を正しく行うには、使用する dll の名前 (この例では "SampleGenerator" の後に ".Extensions.xml" を付けます) を入力する必要があります。
SampleGenerator.Extensions.xml ファイルを開き、次の XML に合わせて更新します。 前の手順で取得したアセンブリのバージョン、カルチャ、および PublicKeyToken に置き換えます。
メモ : 拡張機能の種類では、クラスの完全修飾名を使用する必要があります。 この例では、extension type="SampleGenerator.AddressGenerator" とします。
<?xml version="1.0" encoding="utf-8"?> <extensions assembly="" version="1" xmlns="urn: Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn: Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd"> <extension type="SampleGenerator.AddressGenerator" assembly="SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/> </extensions>
[ファイル] メニューの [すべてを保存] をクリックします。
次に、アセンブリと XML ファイルを Extensions ディレクトリにコピーします。 Database Edition が起動すると、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions ディレクトリとそのサブディレクトリ内の拡張機能が識別され、セッションで使用できるよう登録されます。
アセンブリと XML ファイルを Extensions ディレクトリにコピーするには
<Microsoft Visual Studio 9.0>\VSTSDB\Extensions\ ディレクトリに CustomGenerators という名前の新しいフォルダを作成します。
SampleGenerator.dll アセンブリ ファイルを、マイ ドキュメント\Visual Studio 2008\Projects\SampleGenerator\SampleGenerator\bin\Debug\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomGenerators ディレクトリにコピーします。
SampleGenerator.Extensions.xml ファイルを、マイ ドキュメント\Visual Studio 2008\Projects\SampleGenerator\SampleGenerator\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\ CustomGenerators ディレクトリにコピーします。
ヒント : 拡張機能アセンブリは、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions ディレクトリにフォルダを作成して格納することをお勧めします。 これにより、もともと製品に用意されていた拡張機能と、自分の作成した拡張機能を識別できます。 また、フォルダを使用すると、拡張機能を詳細なカテゴリに分類することもできます。
アドレス ジェネレータのテスト
これでアドレス データ ジェネレータが作成されました。次に Database Edition の新しいインスタンスを起動する必要があります。 Database Edition が起動すると、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomGenerators ディレクトリに追加した SampleGenerator アセンブリが登録されます。 次に、アドレス データ ジェネレータが正しく機能するかどうかを確認するためのデータベース プロジェクトを作成します。
データベース プロジェクトを作成するには
Database Edition の新しいインスタンスを起動します。これにより、SampleGenerator.dll アセンブリが認識および登録されます。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] で、[Microsoft SQL Server] をクリックします。
[テンプレート] の [SQL Server 2005 ウィザード] をクリックします。
[名前] ボックスに「SampleGeneratorDB」と入力します。
メモ : 「チュートリアル : CHECK 制約のカスタム データ ジェネレータの作成」の手順をすべて完了している場合は、SampleGeneratorDB プロジェクトが既に作成されているため、次の手順「データベース プロジェクトにテーブルを追加するには」に進むことができます。
[ソリューションのディレクトリを作成] チェック ボックスをオンにします。
[場所] ボックス、[ソリューション名] ボックス、および [ソース管理に追加] ボックスの既定値をそのまま使用し、[OK] をクリックします。
[完了] をクリックします。 ウィザードが完了したら、もう一度 [完了] をクリックします。
ソリューション エクスプローラに、新しいデータベース プロジェクト SampleGeneratorDB が表示されます。
[表示] メニューの [その他のウィンドウ] をポイントし、[データベース スキーマ ビュー] をクリックします。
スキーマ ビューがまだ表示されていない場合は、表示されます。
次に、varchar SQL 型の列を 1 つ含む単純なテーブルをプロジェクトに追加します。
データベース プロジェクトにテーブルを追加するには
スキーマ ビューで、[SampleGeneratorDB] ノードを展開し、[スキーマ] ノードを展開します。次に、[dbo] ノードを展開し、[テーブル] ノードをクリックします。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
メモ : スキーマ ビューで SampleGeneratorDB プロジェクトを右クリックし、[追加] をポイントして、[テーブル] をクリックする方法もあります。
[テンプレート] の [テーブル] をクリックします。
メモ : [カテゴリ] ボックスの一覧で、[テーブルとビュー] をクリックすると、テーブルのテンプレートを簡単に検索できます。
[名前] ボックスに、新しいテーブルの名前として「Addresses」と入力します。
[追加] をクリックして、テーブルをデータベース プロジェクトに追加します。
ソリューション エクスプローラに、データベース プロジェクトの新しいテーブルのファイルが表示されます。スキーマ ビューに新しいテーブル オブジェクトが表示されます。 Transact-SQL (T-SQL) エディタに新しいテーブルの定義が表示されます。
T-SQL エディタで、次の例に示すようにテーブルの定義を変更します。
CREATE TABLE [dbo].[Addresses] ( address varchar(100) )
[ファイル] メニューの [dbo.Addresses.table.sql の保存] をクリックします。
テーブルが作成されました。これでデータベースを配置用に構成できます。
プロジェクトの配置設定を構成するには
ソリューション エクスプローラで、[SampleGeneratorDB] (ソリューションではなくプロジェクト) をクリックします。
[プロジェクト] メニューの [SampleGeneratorDB のプロパティ] をクリックします。
プロジェクトの [プロパティ] ウィンドウが表示されます。
メモ : ソリューション エクスプローラで SampleGeneratorDB プロジェクトを右クリックし、[プロパティ] をクリックする方法もあります。
[配置] タブをクリックします。
[配置動作] の [配置スクリプト (sql) を作成してデータベースに配置します] をクリックします。
[編集] をクリックし、ターゲット接続を指定します。
SampleGeneratorDB データベースを配置するデータベース サーバーへの接続情報を指定します。
[データベース名の選択または入力] に「SampleGeneratorDB」と入力します。
[OK] をクリックします。
[ターゲット接続] ボックスに接続文字列が入力されます。 [ターゲット データベース名] は SampleGeneratorDB に設定されます
その他のオプションについては既定値を使用します。
[ファイル] メニューの [選択されたファイルを上書き保存] をクリックします。
プロジェクト ビルドの設定が保存されます。
次に、データベース プロジェクトをビルドします。
データベース プロジェクトをビルドするには
[ビルド] メニューの [ソリューションのビルド] をクリックします。
データベース プロジェクトがビルドされます。 成功した場合は、ステータス バーに "ビルド正常終了" と表示され、[出力] ウィンドウにビルド結果が表示されます。
次に、データベース プロジェクトを配置します。
データベース プロジェクトをデータベース サーバーに配置するには
ソリューション エクスプローラで、[SampleGeneratorDB] (ソリューションではなくプロジェクト) をクリックします。
[ビルド] メニューの [SampleGeneratorDB の配置] をクリックします。
ビルド構成に指定した接続を使って、データベース プロジェクトが配置されます。 "配置に成功しました" というメッセージがステータス バーと [出力] ウィンドウに表示されます。
データ生成計画の作成と構成
次に、データ生成計画を作成します。 データ生成計画には、データ入力先のテーブルと列に関する情報が含まれています。 詳細については、「方法 : データ生成計画を作成する」を参照してください。
データ生成計画を作成して構成するには
ソリューション エクスプローラで、[Data Generation Plans] ノードを選択します。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
カテゴリ ペインで、[データ生成計画] をクリックします。
テンプレート ペインで、[データ生成計画] をクリックします。
[名前] ボックスに「SampleGenerator.dgen」と入力します。
[追加] をクリックします。
データ生成計画が作成されます。 データ生成計画および [データ生成プレビュー] ウィンドウが表示されます。
データ生成計画ウィンドウは水平に 2 つのペインに分割されています。 上部のペインには、データベース プロジェクト スキーマで定義されたテーブル (この例では dbo.Addresses テーブル) が示されます。 下部のペインには、上部のペインで強調表示されているテーブルの列 (この例では address 列) の詳細が表示されます。
メモ : [データ生成プレビュー] ウィンドウが開いていない場合は、[データ] メニューの [データ生成] をポイントし、ウィンドウ名をクリックして開くことができます。 既定では、[データ生成プレビュー] ウィンドウは、データ生成計画ウィンドウの下部にタブ付きでドッキングされます。 ビューを展開するには、ウィンドウをクリックし、[ウィンドウ] メニューの [タブ付きドキュメント] をクリックします。 タイトル バーを右クリックし、[タブ付きドキュメント] をクリックする方法もあります。
SampleGenerator.dgen デザイナで、[dbo.Addresses] テーブルと [address] 列の両方のチェック ボックスがオンになっていることを確認します。
SampleGenerator.dgen デザイナで、[address] 列を選択して [ジェネレータ] ドロップダウン ボタンをクリックし、[AddressGenerator] をクリックします。
これでカスタムの日付の範囲ジェネレータが正しく構成されました。
[ファイル] メニューの [すべてを保存] をクリックします。
データ生成計画の実行によるアドレス データの生成
最後に、データ生成計画を実行して、カスタムのアドレス データ ジェネレータが機能するかどうかを確認します。
データ生成計画を実行するには
ソリューション エクスプローラで、[SampleGenerator.dgen] をクリックします。
メモ : また、データ生成計画も開いている必要があります。計画が開いていない場合は、最初に開いてください。
[データ] メニューの [データ ジェネレータ] をポイントし、[データの生成] をクリックします。
[データベースへの接続] ダイアログ ボックスが表示されます。
[データ生成接続情報] ボックスの一覧で、[SampleGeneratorDB] データベースをクリックし、[OK] をクリックします。
新しい行を挿入する前にテーブルの内容を消去するかどうか確認するメッセージが表示された場合、[はい] をクリックします。
データが生成されます。 [作成] ウィンドウの状態列で、データ生成の状態が更新されます。 ステータス バーには、全テーブルのデータ生成の概要が表示されます。
(省略可能) 別のツールを使用して、データベースにログオンします。 この手順では、Database Edition に用意されている Transact-SQL (T-SQL) エディタを使用することもできます。 詳細については、「Transact-SQL エディタを使用したデータベース スクリプトおよびオブジェクトの編集」を参照してください。
次のクエリを実行して、新しいデータを表示します。
use SampleGeneratorDB select * from dbo.Addresses
[結果] タブには、ランダムな値の州および郵便番号を含むアドレスが表示されます。
次の手順
Visual Studio Team System Database Edition には DateTime ジェネレータが用意されています。このジェネレータは、ジェネレータの Min プロパティと Max プロパティを使用して特定の範囲内の日付を求める CHECK 制約が設定されている列に対して使用できます。 「チュートリアル : CHECK 制約のカスタム データ ジェネレータの作成」では、日付を 2 つの異なる範囲のうちの 1 つにする必要がある CHECK 制約が設定されている列に対して、カスタムのデータ ジェネレータを作成します。
参照
処理手順
概念
参照
Microsoft.VisualStudio.TeamSystem.Data.DataGenerator