移行前スクリプト A1 で特定されたデータ問題を修正する (Project Server 2010)
適用先: Project Server 2010
トピックの最終更新日: 2016-11-30
Microsoft Office Project Server 2003 データに対して移行前スクリプトを実行したら、問題が発生しているかどうかをスクリプトの出力で確認します。この記事では、出力で特定されたデータの問題を解決する方法について説明します。内容は次のとおりです。
チェックアウトされているプロジェクト
外部で編集されているプロジェクト
保留中の進捗の更新があるプロジェクト
重複したエンタープライズ リソース
Project Server 2003 の製品バージョンを最低でも Service Pack 2a にする
複数のプロジェクトにまたがって重複しているエンタープライズ リソース
エンタープライズ グローバル テンプレートが外部で編集されている
エンタープライズ グローバル テンプレートがチェックアウトされている
エンタープライズ グローバル テンプレートがロックされている
Web テーブル データベースとプロジェクト テーブル データベースの既定の言語が一致している
エンタープライズ リソースの名前にコンマが含まれていない
エンタープライズ リソースの必須ユーザー設定フィールドに値が設定されていない
必須エンタープライズ リソース ユーザー設定フィールドが、参照テーブルの定義に含まれていない値を持つ
エンタープライズ リソースが外部で編集されている
エンタープライズ リソース期間ユーザー設定フィールドが値のリストを持つ
エンタープライズ リソース期間ユーザー設定フィールドの値が無効
ここで定めれているデータ問題を解決したら、移行前スクリプト A1 を再実行して、データ問題が解決されたことを確認してください。
チェックアウトされているプロジェクト
プロジェクトがチェックアウトされている場合、そのプロジェクトは移行できません。移行の前に、ソース データを安定した状態にすることをお勧めします。意識的にプロジェクトをチェックインすることで、プロジェクトを移行対象として安定した状態にします。移行コーディネーターは、プロジェクト管理者が特定の日付までにプロジェクトをチェックインする期限を設定し、その日付を過ぎたらすべてのプロジェクトのチェックインを強制的に行うことができます。
問題の修正方法
チェックアウトされているプロジェクトをすべてチェックインします。
Project Server 2003 でチェックアウトされているプロジェクトをチェックインするには
Microsoft Office Project Server 2003 Project Web Access で、[管理] をクリックします。
[エンタープライズ機能の管理] をクリックします。
[エンタープライズ プロジェクトのチェックイン] をクリックし、チェックアウトされているプロジェクトを確認します。そのプロジェクトをチェックインするか、Project Web Access から強制チェックイン操作を実行します。
注意
"Project Server 2003 プロジェクト テーブル" データベースと "Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行して、チェックアウトされているプロジェクトがないかテストすることもできます。select PROJ_NAME from dbo.MSP_PROJECTS where PROJ_CHECKEDOUT = 1 and PROJ_TYPE in (0, 1)
何らかの結果が返された場合、参照されているプロジェクトはチェックアウトされています。
外部で編集されているプロジェクト
プロジェクトが外部で編集されている場合、そのプロジェクトは移行できません。
問題の修正方法
外部で編集されたプロジェクトを Project Professional 2003 で開いて保存し、サーバーにチェックインして戻します。これによって、[外部で編集] フラグが [false] に設定されます。
保留中の進捗の更新があるプロジェクト
既定では、Project Server 2003 プロジェクトに保留中の更新があると、Project Server 2007 に移行しません。移行前に、ユーザーに進捗の更新を承諾または却下してもらい、プロジェクトを移行するための安定した状態にすることをお勧めします。
問題の修正方法
保留中の更新があるプロジェクトの移行ができるように、移行構成ファイルの StopProjectMigrationIfStatusUpdatesPending パラメーターを構成します。このパラメーターの詳細については、「移行ツールを構成する」を参照してください。
移行前の手順として、プロジェクト管理者が特定の日付までに保留中の進捗の更新を承諾または却下する期限を設定することをお勧めします。その日付を過ぎたら、(進捗の更新が行われていない場合でも) すべてのプロジェクトを強制的に移行します。
重複したエンタープライズ リソース
Project Server 2003 または Project Server 2007 では、エンタープライズ リソース共有元に同じ名前のリソースを複数持つことはできません。この状況が発生している場合、データベースを直接編集した結果であることがあります。エンタープライズ リソース共有元を編集しているときには、重複した名前が Project Professional に表示されない場合があることに注意してください。これは、エンタープライズ リソースの MSP_WEB_RESOURCES テーブルに、この名前のエントリが 1 つしかないために発生します。この状況を解決する簡単な方法はありません。Project Server の専門家と共同で解決してください。重複したエンタープライズ リソースによって発生する問題がないかどうかをチェックして修正するための、いくつかのガイドラインを次に示します。
重複したエンタープライズ リソースを特定する
移行前スクリプト A1 は、データ内に重複したエンタープライズ リソースがデータ内にある場合に、それらを特定します。スクリプトによって重複したエンタープライズ リソースが見つかると、2 つの重複したリソースがある次の例と同様のデータが表示されます。
RES_UID | RES_NAME | RES_EUID |
---|---|---|
123 |
Peter Krebbs |
123 |
124 |
Peter Krebbs |
123 |
125 |
Brad Sutton |
125 |
126 |
Brad Sutton |
126 |
重複したエンタープライズ リソースがプロジェクトで使用されているかどうかを特定する
移行前スクリプト A1 は、データ内に重複したエンタープライズ リソースがある場合に、それらを特定します。スクリプトによって重複したエンタープライズ リソースが見つかると、2 つの重複したリソースがある次の例と同様のデータが表示されます。
RES_NAME | RES_EUID |
---|---|
Peter Krebbs |
123 |
Brad Sutton |
125 |
Brad Sutton |
126 |
重複したエンタープライズ リソースを使用するプロジェクトを修正する
次のクエリ (クエリ 1) を実行すると、重複しているエンタープライズ リソースに関連付けられているプロジェクト ID が返されます。このような重複をなくして、プロジェクトでは "res_name, res_euid" という組合せが 1 つだけ使用されるようにする必要があります。重複が存在する場合は、重複したいずれかのリソースを "適切な" リソースと指定し、すべてのプロジェクトでこのリソースを使用する必要があります (そのプロジェクトの MSP_RESOURCES.RES_EUID 列を更新して、適切なエンタープライズ リソースだと指定したリソースを指すようにする必要があります)。その後でスクリプト A1 を実行し、重複したエンタープライズ リソースがプロジェクトで使用されていないかの確認テストを繰り返してください。
クエリ 1:
select res_name, res_euid, proj_id from msp_resources where res_name in (select distinct r1.RES_NAME from dbo.MSP_RESOURCES r1 inner join dbo.MSP_RESOURCES r2 on (r1.RES_NAME = r2.RES_NAME and r1.PROJ_ID = r2.PROJ_ID) where r1.PROJ_ID = 1 and r1.RES_UID != r2.RES_UID) and proj_id <> 1 and res_euid is not null order by res_name, res_euid asc
たとえば、クエリ 1 を実行したら次の結果が返されたとします。
RES_NAME | RES_EUID | PROJ_ID |
---|---|---|
Brad Sutton |
125 |
12 |
Brad Sutton |
126 |
13 |
Brad Sutton |
125 |
14 |
この状況を解決するには、RES_EUID が 125 の "Brad Sutton" を "適切な" エンタープライズ リソースとして選択し、次のように行を修正します。
RES_NAME | RES_EUID | PROJ_ID |
---|---|---|
Brad Sutton |
125 |
12 |
Brad Sutton |
125 |
13 |
Brad Sutton |
125 |
14 |
適切なリソースを指すように重複したエンタープライズ リソースを修正する
前のセクションでは、重複の中から適切なリソースを指定し、プロジェクトがそのリソースを指すように修正しました。今度は、指定したリソースに従って MSP_RESOURCES テーブルを変更する必要があります。クエリ 4 (クエリ 1 と同じ) を実行し、重複しているエンタープライズ リソースの一覧を取得します。次に、適切なリソースとして割り当てたリソースを指すように、重複しているリソースの RES_EUID 列を更新します。
クエリ 4:
select res_uid, res_name, res_euid from msp_resources where res_name in (select distinct r1.RES_NAME from dbo.MSP_RESOURCES r1 inner join dbo.MSP_RESOURCES r2 on (r1.RES_NAME = r2.RES_NAME and r1.PROJ_ID = r2.PROJ_ID) where r1.PROJ_ID = 1 and r1.RES_UID != r2.RES_UID) and proj_id = 1 order by res_name asc
たとえば、クエリ 4 を実行したら次の結果が返されたとします。"Peter Krebbs" の行は適切ですが、"Brad Sutton" の行を修正する必要があります。
RES_UID | RES_NAME | RES_EUID |
---|---|---|
123 |
Peter Krebbs |
123 |
124 |
Peter Krebbs |
123 |
125 |
Brad Sutton |
125 |
126 |
Brad Sutton |
126 |
この状況を解決するには、RES_UID が 125 の "Brad Sutton" を "適切な" リソースとして選択し、この項目を指すように他の行を更新します。たとえば、次のようにします。
RES_UID | RES_NAME | RES_EUID |
---|---|---|
123 |
Peter Krebbs |
123 |
124 |
Peter Krebbs |
123 |
125 |
Brad Sutton |
125 |
126 |
Brad Sutton |
125 |
エンタープライズ リソース共有元から重複したリソースを削除する
重複したリソースが偽のプロジェクト (PROJ_ID = 最大整数値) を指すようにすると、エンタープライズ リソース共有元から重複したリソースを削除できます。さらに、関連するエンタープライズ カレンダーもクリーンアップする必要があります。これを実行するためにクエリ 5 を実行します。
クエリ 5:
update msp_resources set proj_id=2147483647 WHERE res_uid != res_euid and res_euid is not null and res_uid > 0 and proj_id = 1
update msp_calendars set proj_id=2147483647 WHERE res_uid not in (select res_uid from msp_resources where proj_id=1) and proj_id = 1 and cal_uid > 0 and res_uid is not null
前の手順が完了したら、もう一度 -verify オプションを指定して移行ツールを実行し、重複したリソースの問題が解決されていることを確認します。
Project のバージョンを最低でも "Project Server 2003 SP2a" にする
Project Server 2003 SP2a または SP3 からの移行がサポートされています。少なくとも Service Pack 2a がインストールされていない場合は、SP2a または SP3 のどちらかを適用する必要があります (最新の Service Pack 3 を適用することをお勧めします)。
問題の修正方法
インストール済みの Project Server 2003 に Project Server 2003 SP3 を適用します。Project Server 2003 SP3 の詳細については、マイクロソフト サポート技術情報の記事「Project Server 2003 Service Pack 3 について」(https://go.microsoft.com/fwlink/?linkid=188720\&clcid=0x411) を参照してください。
エンタープライズ グローバル テンプレートが外部で編集されている
エンタープライズ グローバル テンプレートがプロジェクトの外部で (たとえば、サード パーティ アプリケーションによって) 編集されると、[外部で編集] フラグが [true] に設定されます。Project Professional はこのフラグを調べます。フラグが [true] に設定されている場合、Project Professional は一貫性を保持するためにエンタープライズ グローバル テンプレートのデータをすべて再計算します。移行を可能にするには、このフラグを [false] に設定する必要があります。
問題の修正方法
Project Professional でエンタープライズ グローバルを開き、サーバーに保存し直します。
エンタープライズ グローバル テンプレートがチェックアウトされている
プロジェクトを移行するときには、エンタープライズ グローバル テンプレートがチェックアウトされていてはいけません。
問題の修正方法
エンタープライズ グローバルがチェックインされていることを確認します。
Project Server 2003 Project Web Access で、[管理] をクリックします。
[エンタープライズ機能の管理] をクリックします。
[エンタープライズ プロジェクトのチェックイン] をクリックし、エンタープライズ グローバルをチェックアウトしたユーザーを確認します。そのプロジェクトがチェックインされるようにユーザー間で調整するか、Project Web Access から強制チェックイン操作を実行します。
エンタープライズ グローバル テンプレートがロックされているかどうかを特定する
コンピューターで異常シャットダウンが発生したり、Project Professional が異常終了すると、プロジェクトはロックされます。エンタープライズ グローバル テンプレートがロックされていると、移行ツールを実行できません。
問題の修正方法
次の SQL クエリで、エンタープライズ グローバル テンプレートのロックを解除します。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。
Update MSP_PROJECTS set PROJ_LOCKED = 1 where PROJ_TYPE = 2
Project Server 2003 Web テーブル データベースと Project Server 2003 プロジェクト テーブル データベースの既定の言語が一致しているかどうかを判別する
移行前に、Project Server 2003 Web テーブル データベースと Project Server 2003 プロジェクト テーブル データベースの既定の言語が一致している必要があります。
問題の修正方法
管理者と協力して、2 つのデータベース間で一貫性がない状態を修正します。
リソース名にコンマが含まれているかどうかを判別する
どの言語でもエンタープライズ リソース名にコンマ文字 (,) を含めることができないことは、Project Server 2007 の制限です。この文字を有効な文字で置き換える必要があります。
問題の修正方法
"Project Server 2003 プロジェクト テーブル" データベースと "Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行します。これにより、コンマがアンダースコアに置き換えられます。クエリを編集すると、有効な別の文字を使用できます。
-- run this against the project tables db
declare @replacement_char char
declare @char_to_replace char
set @replacement_char = '_'
set @char_to_replace = ','
update dbo.MSP_RESOURCES set RES_NAME = replace(RES_NAME, @char_to_replace, @replacement_char)
where RES_NAME is not null and charindex(@char_to_replace, RES_NAME) > 0
-- run this against the web tables db
declare @replacement_char char
declare @char_to_replace char
set @replacement_char = '_'
set @char_to_replace = ','
update dbo.MSP_WEB_RESOURCES set RES_NAME = replace(RES_NAME, @char_to_replace, @replacement_char)
where RES_NAME is not null and charindex(@char_to_replace, RES_NAME) > 0
エンタープライズ リソースの必須ユーザー設定フィールドに値が設定されていない
必須ユーザー設定フィールド (RBS など) に値が設定されていないエンタープライズ リソースがあると、移行は失敗します。移行中に、移行ログにエラーが記録されます。このシナリオが発生していないか、移行前に確認することをお勧めします。エンタープライズ リソースが非常に古いか (ユーザー設定フィールドを "必須" とする前に作成されている)、無効になっている場合、必須ユーザー設定フィールドの値が入っていないことがあります。
問題の修正方法
Project Server 2003 でエンタープライズ リソース共有元を開き、必須ユーザー設定フィールドの値を設定するか、値が入っていないユーザー設定フィールドを [必須としない] に設定します。これによって、移行後に Office Project Server 2007 で手動で元に戻すことができます。
リソースのユーザー設定フィールドに、参照テーブルの定義にない値が入っている
リソースのユーザー設定フィールドの値は、すべて参照テーブルの定義に入っている必要があります。
問題の修正方法
次の SQL クエリで、リソースの無効なユーザー設定フィールドの値を null に設定します。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。
declare @eglobal_proj_id int
set @eglobal_proj_id = (select PROJ_ID from dbo.MSP_PROJECTS where PROJ_TYPE = 2)
update dbo.MSP_MV_FIELDS
set
CODE_UID = NULL
from dbo.MSP_MV_FIELDS cf1
left join dbo.MSP_OUTLINE_CODES oc1 on (oc1.CODE_UID = cf1.CODE_UID and (cf1.CODE_FIELD_ID - 76) = oc1.OC_FIELD_ID and oc1.PROJ_ID = @eglobal_proj_id)
left join (
select
oc.CODE_UID,
fa.ATTRIB_FIELD_ID as OC_FIELD_ID,
@eglobal_proj_id as PROJ_ID
from
dbo.MSP_OUTLINE_CODES oc
inner join dbo.MSP_FIELD_ATTRIBUTES fa on (fa.PROJ_ID = oc.PROJ_ID and fa.ATTRIB_VALUE = oc.OC_FIELD_ID and fa.ATTRIB_ID = 212)
where
oc.PROJ_ID = @eglobal_proj_id
and fa.PROJ_ID = @eglobal_proj_id
and fa.ATTRIB_ID = 212
) as oc2 on (oc2.CODE_UID = cf1.CODE_UID and (cf1.CODE_FIELD_ID - 76) = oc2.OC_FIELD_ID and oc2.PROJ_ID = @eglobal_proj_id)
where
cf1.proj_id = 1
and oc1.CODE_UID is null
and oc2.CODE_UID is null
update dbo.MSP_CODE_FIELDS
set
CODE_UID = NULL
from dbo.MSP_CODE_FIELDS cf1
left join dbo.MSP_OUTLINE_CODES oc1 on (oc1.CODE_UID = cf1.CODE_UID and cf1.CODE_FIELD_ID = oc1.OC_FIELD_ID and oc1.PROJ_ID = @eglobal_proj_id)
left join (
select
oc.CODE_UID,
fa.ATTRIB_FIELD_ID as OC_FIELD_ID,
@eglobal_proj_id as PROJ_ID
from
dbo.MSP_OUTLINE_CODES oc
inner join dbo.MSP_FIELD_ATTRIBUTES fa on (fa.PROJ_ID = oc.PROJ_ID and fa.ATTRIB_VALUE = oc.OC_FIELD_ID and fa.ATTRIB_ID = 212)
where
oc.PROJ_ID = @eglobal_proj_id
and fa.PROJ_ID = @eglobal_proj_id
and fa.ATTRIB_ID = 212
) as oc2 on (oc2.CODE_UID = cf1.CODE_UID and cf1.CODE_FIELD_ID = oc2.OC_FIELD_ID and oc2.PROJ_ID = @eglobal_proj_id)
where
cf1.proj_id = 1
and oc1.CODE_UID is null
and oc2.CODE_UID is null
update dbo.MSP_PROJECTS set PROJ_EXT_EDITED = 1, PROJ_EXT_EDITED_CODE = 1 where PROJ_ID = 1
エンタープライズ リソースが外部で編集されている
Project Server 2003 から Project Server 2007 にエンタープライズ リソースを移行するには、それらのリソースが外部で編集されていてはいけません。
問題の修正方法
問題を解決するには、最初に、すべてのエンタープライズ リソースが外部で編集されると設定する必要があります。この設定は SQL クエリによって実行できます。その後で、エンタープライズ リソース共有元が保存されるときに、関連する更新が Project Professional によってすべて行われるように、それぞれのエンタープライズ リソースに変更を加えることができます。この操作によって、各エンタープライズ リソースの [外部で編集] フラグが削除されます。エンタープライズ リソースが変更されていなければ、Project Professional はそのリソースに対する再計算を行いません。これに該当するエンタープライズ リソースには引き続き [外部で編集] フラグが設定され、エンタープライズ リソース共有元が移行されません。
注意
エンタープライズ リソース共有元が移行されたら、各エンタープライズ リソースに加えた変更を削除できます。
次の一般的な回避策を使用して、外部で編集されたすべてのフラグをエンタープライズ リソースから削除できます。
すべてのエンタープライズ リソースを、外部で編集される設定にします。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行すると、この設定を実行できます。
Update dbo.MSP_RESOURCES set EXT_EDIT_REF_DATA = 1 where PROJ_ID = 1
Update dbo.MSP_PROJECTS set PROJ_EXT_EDITED = 1, PROJ_EXT_EDITED_DATE = 1, PROJ_EXT_EDITED_DUR = 1, PROJ_EXT_EDITED_NUM = 1, PROJ_EXT_EDITED_FLAG = 1, PROJ_EXT_EDITED_CODE = 1, PROJ_EXT_EDITED_TEXT = 1 where PROJ_ID = 1
それぞれのエンタープライズ リソースに、重要でないリソースのユーザー設定フィールドを一時的に追加し、Project Professional 2003 によって再計算が強制的に行われるようにします。強制的な再計算を行うと、各エンタープライズ リソースは外部で編集されたとマークされなくなります。たとえば Project Professional 2003 で、各エンタープライズ リソースに追加される "テスト" ユーザー設定フィールドをリソースに作成できます。任意のユーザー設定フィールドの種類を使用できます。たとえば、あまり使用されませんが、"リソース期間" ユーザー設定フィールドを使用できます。
注意
"エンタープライズ リソース期間" ユーザー設定フィールドを使用する場合、このフィールドの値リストを作成しないでください。値リストがある "エンタープライズ リソース期間" ユーザー設定フィールドは移行されません。この一時的なユーザー設定フィールドを作成するときには、数値を使用してください。
新しいユーザー設定フィールドの名前は、"Test Resource CF" のように付けます。"Test Resource CF" ユーザー設定フィールドを作成したら、エンタープライズ リソース共有元を開き、"Test Resource CF" 列を追加します。すべてのリソースについて、このユーザー設定フィールドの有効な値を設定します。エンタープライズ リソース共有元を保存し、移行を実行します。移行後には、Microsoft Office Project Professional 2007 で "Test Resource CF" ユーザー設定フィールドを削除します。
値リストがある "エンタープライズ リソース期間"
関連付けられた値リストがある "エンタープライズ リソース期間" ユーザー設定フィールドは、移行が失敗する原因になります。
問題の修正方法
問題を解決するには、SQL クエリで見つかったそれぞれの "エンタープライズ リソース期間" ユーザー設定フィールドから、すべての値リストを手動で削除する必要があります。これは、次の手順に従って行うことができます。
Project Server 2003 サーバーに接続された Project Professional 2003 を開きます。
[ツール] メニューの [エンタープライズ オプション] をポイントし、[エンタープライズ グローバルを開く] をクリックします。
[Microsoft Project - エンタープライズ グローバル - チェックアウト] ページで、[ツール] メニューの [ユーザー設定] をポイントし、[エンタープライズ フィールド] をクリックします。
[エンタープライズ ユーザー設定フィールド] ページの [ユーザー設定フィールド] タブで、[フィールド] セクションの [リソース] をクリックします。
[種類] ボックスの一覧の [期間] をクリックします。[フィールド] ボックスの一覧に、すべての "エンタープライズ期間" ユーザー設定フィールドが表示されます。
[フィールド] ボックスの一覧で、前に実行した SQL クエリによって返されたものと一致する最初の "エンタープライズ リソース期間" ユーザー設定フィールドを選択します。[属性] セクションで、[値リスト] をクリックします。特定の "エンタープライズ期間" ユーザー設定フィールドの値リストで、[値] 列の値をすべて削除し、[OK] をクリックします。表示された Microsoft Office Project のダイアログ ボックスで、[OK] をクリックします。
[エンタープライズ フィールドのユーザー設定] ページの [属性] セクションで、[フィールド] ボックスの一覧で選択した "エンタープライズ リソース期間" ユーザー設定フィールドの [値リスト] が選択されていないことを確認します。[値リスト] が選択されている場合は、[なし] を選択します。
[フィールド] ボックスの一覧で、SQL クエリに対応する残りの "エンタープライズ リソース期間" ユーザー設定フィールドをすべて選択し、手順 6. と手順 7. を繰り返します。
[OK] をクリックします。
"エンタープライズ リソース期間" ユーザー設定フィールドに有効な値が含まれている
Project Server 2010 では、負の期間の値や、34689600 より大きい期間の値は使用できません。どちらかを含む Project Server 2003 の "エンタープライズ リソース期間" ユーザー設定フィールドを移行しようとすると、移行に失敗します。
問題の修正方法
問題を解決するには、識別されたユーザー設定フィールドごとに、"エンタープライズ リソース期間" ユーザー設定フィールドの値を手動で編集する必要があります。フィールドの値は、有効 (0 ~ 34689600) であるようにする必要があります。
クエリによって識別されたフィールドが、単純なユーザー設定フィールド (数式フィールドではない) である場合は、許容範囲内でフィールドの値を変更できます。クエリによって識別されたフィールドが数式フィールドである場合は、結果が有効な範囲内になるように数式を変更する必要があります。