次の方法で共有


データ生成に関する問題のトラブルシューティング

データ生成計画を操作するときに、次の問題が発生する場合があります。

  • CHECK 制約に違反している場合、データ生成が失敗する

  • 正規表現データ ジェネレーターを、ユーザー定義型列に割り当てることができない

  • DELETE トリガーを持つテーブルのデータを生成できない

  • データ バインド ジェネレーターに関する問題

  • SPARSE 列のデータを生成できない

CHECK 制約に違反している場合、データ生成が失敗する

CHECK 制約が設定された列のデータを生成するときに、制約に違反するデータが生成された場合、操作は失敗となります。 [データ生成プレビュー] ウィンドウを使用すると、計画を実行する前に、データが制約に違反するかどうかを確認できます。 詳細については、「方法 : データ生成計画をプレビューする」を参照してください。

この問題を修正するには、次の方法のいずれかを使用します。

  • Min プロパティと Max プロパティを使用して、データの生成方法を制御します。 たとえば、StartDate と EndDate という名前の 2 つの列を持つテーブルと、EndDate より前の StartDate を必要とする CHECK 制約があるとします。 StartDate 列の Max プロパティを、EndDate 列の Min プロパティよりも小さい値に設定すると、目標を達成できます。 詳細については、「列へのデータ生成の詳細の指定」を参照してください。

  • データ バインド ジェネレーターを使用します。 詳細については、「データ バインド ジェネレーター」を参照してください。

  • カスタム データ ジェネレーターを使用します。 詳細については、「カスタム データ ジェネレーターを使用した特殊なテスト データの生成」を参照してください。

正規表現データ ジェネレーターを、UNIQUE 制約が設定されたユーザー定義型列に割り当てることができない

データ ジェネレーターを、UNIQUE 制約が設定された列に割り当てようとすると、使用可能なジェネレーターの一覧には、一意の値を生成できるジェネレーターのみが表示されます。 正規表現ジェネレーターは一意の値を生成するとは限らないため、このジェネレーターを使用して、UNIQUE 制約が設定されたユーザー定義型列に入力できません。

UNIQUE 制約が設定されたユーザー定義型列のデータを生成するには、データ バインド ジェネレーターまたはカスタム データ ジェネレーターを使用する必要があります。 詳細については、「データ バインド ジェネレーター」および「カスタム データ ジェネレーターを使用した特殊なテスト データの生成」を参照してください。

DELETE トリガーを持つテーブルのデータを生成できない

テーブル内の行を削除できないトリガーを持つテーブルがあります。 このようなテーブルから行を削除しようとすると、トリガーにより削除操作がロールバックされます。 通常は、このようなテーブルのデータ、またはこのようなテーブルを参照するテーブルのデータは生成できません。 たとえば、通常は AdventureWorks データベースの Employee テーブルのデータは生成できません。

このようなテーブルのデータを生成するには、次のいずれかの方法を使用します。

  • トリガーを無効にするか、または削除し、データ生成計画を実行して、トリガーを再び有効にするか追加します。

  • データ生成計画を実行します。 新しい行を挿入する前にテーブルの内容を消去するかどうか確認するメッセージが表示された場合は、[いいえ] をクリックします。 生成した新しいデータがテーブル内の既存データに追加され、DELETE トリガーは発生しません。 この方法により予測できない結果が生じる可能性があり、いずれかの列に UNIQUE 制約が設定されている場合は、エラーが表示されることがあります。

データ バインド ジェネレーターに関する問題

データ バインド ジェネレーターを指定した 1 つ以上の列でデータの生成に失敗した場合、[列の詳細] ウィンドウの [ジェネレーター出力] 列に "出力なし" または "強制出力なし" と表示されます。 以降のセクションでは、この種のデータ生成エラーが発生する理由について説明します。

出力なし

[ジェネレーター出力] 列に "出力なし" と表示された場合、クエリの選択プロパティに指定した SELECT ステートメントが正しくない可能性があります。 プロパティ ウィンドウでは SELECT ステートメントを確認しづらいため、Transact-SQL エディターにコピーして、ステートメントが正しいかどうかを確認してください。

強制出力なし

[ジェネレーター出力] 列に "強制出力なし" と表示された場合、SELECT ステートメントから返されるデータ型を、データの生成対象となる列のデータ型に対し、強制的に変換することができません。 たとえば、INT 型の列に対してデータを生成する場合、次の SELECT ステートメントを実行すると、"強制出力なし" が表示されます。

SELECT RAND() * (column1 - column2) AS Column1 FROM Table1

INT 型への強制変換が可能なデータを返すように SELECT ステートメントを更新する必要があります。

SELECT CAST(RAND() * (column1 - column2) AS INT) AS Column1 FROM Table1

SPARSE 列のデータを生成できない

1 つ以上の SPARSE 列と 1 つの COLUMN_SET を含むテーブルのデータを生成しようとしたときに、"次の例外が発生したため、データを生成できませんでした: 指定された ColumnMapping は、ソースまたはターゲットのどの列とも一致しません" というエラーが表示されることがあります。

たとえば、次のテーブルのデータを生成しようとしたときに、このエラーが発生します。

CREATE TABLE [dbo].[SparseTable]
(
ID INT PRIMARY KEY,
C1 varchar(20) SPARSE NULL, 
C2 smallint SPARSE NULL,
C3 varchar(20) SPARSE NULL,
SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
)

SPARSE 列と COLUMN_SET を含むテーブルのデータを生成するには、データ挿入方法の指定を "SqlV1CompatibilitySink" に変更するか、カスタム データ ジェネレーターを使用する必要があります。

"SqlV1CompatibilitySink" を使用する場合、サイズの大きなテーブルではデータ生成の速度が低下することがあります。

データ挿入方法の指定を変更する方法の詳細については、「方法: データ ジェネレーターの既定値とオプションを指定する」を参照してください。 カスタム データ ジェネレーターを作成および配置する方法の詳細については、「カスタム データ ジェネレーターを使用した特殊なテスト データの生成」を参照してください。