チーム環境でのデータベース オブジェクトのリファクタリング
Visual Studio Premium では、オフライン形式のデータベース スキーマ (データベース プロジェクトと呼ばれる) をバージョン管理システムに置くことにより、変更を管理します。 チームのメンバーはデータベース プロジェクトに変更を加えることができます。これらの変更は、後でビルドし、ライブ データベースに配置する必要があります。 このような場合は、1 つのデータベースについて最大で次の 4 つの形式が存在することになります。
ライブ データベースとデータが含まれるデータベース サーバー。
データベース スキーマのオフライン形式であるデータベース プロジェクト。
コンパイルされた .dbschema ファイル。データベース スキーマを任意のターゲット データベースおよびサーバーに配置するために必要な情報が格納されます。 このファイルは、データベース プロジェクトをビルドするたびに作成されます。
チームの各メンバーがデータベース プロジェクトに加えたすべての変更を追跡するバージョン管理リポジトリ。
詳細については、「データベースのチーム開発の開始」を参照してください。
チーム環境でのリファクタリング
リファクタリングを使用してデータベース オブジェクトの名前を変更する、またはオブジェクトを別のスキーマに移動する場合、名前が変更された、または移動されたオブジェクトを参照する他のオブジェクトは、新しい名前またはスキーマに合わせて自動的に更新されます。 たとえば、テーブルの列名を変更した場合、その列を参照するストアド プロシージャが、新しい名前に合わせて自動的に更新されます。 詳細については、「データベース オブジェクトへのすべての参照の名前変更」または「別のスキーマへのデータベース オブジェクトの移動」を参照してください。
データベース オブジェクトを更新するには、更新する必要があるすべてのオブジェクトのファイルをソース管理からチェックアウトしておく必要があります。 ファイルを自動的にチェックアウトするようにソース管理のオプションが設定されている場合は、ファイルが自動的にチェックアウトされます。 自動的にチェックアウトする設定が有効でない場合は、ファイルのチェックアウトを求めるメッセージが表示されます。
リファクタリング操作は、次の状況でエラーになります。
1 つ以上のファイルを他のユーザーがロックした場合、メッセージが表示され、リファクタリング操作は取り消されます。 ファイルのロックが解除されてから、操作をやり直してください。
チェックアウトしたファイルがプロジェクトのファイルより新しいバージョンである場合、メッセージが表示され、リファクタリング操作は取り消されます。 操作を再試行する前に、ファイル バージョンを調整する必要があります。
ファイルをチェックアウトするよう求めるメッセージが表示されたときに [キャンセル] をクリックすると、リファクタリング操作は取り消されます。
注意
データベース オブジェクトの名前を変更しても、そのオブジェクトが定義されている .sql ファイルの名前は変更されません。 このファイルの名前は、ソリューション エクスプローラーで手動で変更できます。
リファクタリング ログと意図の保持
データベース オブジェクトの名前変更や移動にリファクタリングを使用するときには、ProjectName.refactorlog ファイルにその操作の詳細が記録されます。 変更を配置するときは、配置スクリプトに変更の意図を保持する操作が含まれるので、ログがその意図を保持するのに役立ちます。 たとえば、配置では、drop ステートメントと create ステートメントの代わりに、sp_rename ステートメントを列に対して実行できます。
リファクタリング ログが更新される変更を複数の開発者が加えた場合、ログ ファイルへの変更がマージされる必要があります。 .refactoring ファイルは単純なスキーマの XML ファイルであるため、更新内容のマージは難しいものにはなりません。 各操作には日時が含まれるため、リファクタリング操作が適切な順序で適用されていることを確認できます。
ヒント
ファクタリング ログの変更内容を自動的にマージする場合、エラーが発生することがあります。 データベース プロジェクトを配置する前に、自動的なマージの変更結果を必ず確認する、または手動でマージする必要があります。
ファクタリング ログは次の例のようになります。
<?xml version="1.0" encoding="utf-16"?>
<Operations>
<Operation Name="Move Schema" Key="677a0ee6-1707-413a-985f-b392b1a2d68b" ChangeDateTime="04/07/2008 21:59:00">
<Property Name="ElementName" Value="[Person].[AbsenceHistory]" />
<Property Name="ElementType" Value="ISql90Table" />
<Property Name="NewSchema" Value="HumanResources" />
<Property Name="IsNewSchemaExternal" Value="True" />
</Operation>
<Operation Name="Rename Refactor" Key="fb88992c-cd6e-43d0-aa54-ed80f155d202" ChangeDateTime="04/07/2008 21:59:26">
<Property Name="ElementName" Value="[HumanResources].[AbsenceHistory].[column_1]" />
<Property Name="ElementType" Value="ISqlSimpleColumn" />
<Property Name="ParentElementName" Value="[HumanResources].[AbsenceHistory]" />
<Property Name="ParentElementType" Value="ISql90Table" />
<Property Name="NewName" Value="EmployeeID" />
</Operation>
</Operations>
この例のログには、2 つのリファクタリング操作が記録されています。 最初の操作で、[AbsenceHistory] テーブルが [Person] スキーマから [HumanResources] スキーマに移動されています。 2 番目の操作で、[AbsenceHistory] テーブルの [column_1] 列の名前は [EmployeeID] に変更されています。