次の方法で共有


移行前の検証およびクリーンアップ

更新日: 2009年5月

 

トピックの最終更新日: 2015-03-09

この記事の内容 :

  • -verify オプションを指定して移行ツールを実行する

  • 移行の問題に対して手動のテストを実行する

ここでは、移行を計画している Microsoft Office Project Server 2003 ソース データが Microsoft Office Project Server 2007 に移行できる有効な状態であることを確認する方法について説明します。また、移行ツールの -verify オプション、Project Server 2003 データベースで実行する SQL クエリなど、移行を計画しているデータが無効でないことや破損していないことを確認するための便利なツールについて説明します。移行前に Project Server 2003 環境で行う必要がある一般的なチェックについても説明します。

Important重要
データベースのサイズによっては、移行プロセスに非常に時間がかかります (詳細については、「Project Server 2007 の移行パフォーマンス データ」を参照してください)。グローバル データの移行が (重複するエンタープライズ リソースなどが原因で) 途中で失敗した場合は、問題の原因を修正し、グローバル データの移行プロセスを最初から繰り返す必要があります。移行プロセスを開始する前に移行前の検証とクリーンアップを実行すると、移行ツールが失敗する可能性を大幅に減らすことができます。

-verify オプションを指定して移行ツールを実行する

移行ツールの -verify オプションによって、次の Project Server 2003 データが確認されます。

  • チェックアウトされているプロジェクト

  • 外部で変更されているプロジェクト

  • 保留中の進捗の更新があるプロジェクト

  • 重複したエンタープライズ リソース

移行ツールは、データを変更して移行に適した状態にする必要があるかどうかを確認します。これらの変更は移行ログ ファイルに書き込まれます。ユーザーの代わりにデータが修正されることはありません。

-verify オプションは、データに対して実行する必要がある唯一のチェックではないことに注意してください。この記事で説明する残りの検証手順を実行して、データが移行できる有効な状態であることを確認する必要があります。

生成されたログ ファイルに目を通し、Project Server 2003 データに必要な変更を行って、データの移行時に発生しそうな問題を解消してください。

[!メモ] -verify オプションを指定して移行ツールを実行すると、移行構成ファイルで移行するように構成されている場合でも、グローバル データやプロジェクト データは移行されません。

プロジェクトがチェックアウトされているかどうかを確認する

プロジェクトがチェックアウトされている場合、そのプロジェクトは移行できません。移行の前に、ソース データを安定した状態にすることをお勧めします。意識的にプロジェクトをチェックインすることで、プロジェクトを移行対象として安定した状態にします。移行コーディネータは、プロジェクト管理者が特定の日付までにプロジェクトをチェックインする期限を設定し、その日付を過ぎたらすべてのプロジェクトのチェックインを強制的に行うことができます。

問題の確認方法

-verify オプションを指定して移行ツールを実行したときに、移行するプロジェクトがチェックアウトされていると、コンソールとログに次のメッセージが表示されます。

次のプロジェクトはチェックアウトされています。これらのプロジェクトは移行ツールによって移行されません (移行ツールは停止せずに、これらのプロジェクトをスキップするだけです)。これらをチェックインしてください。

成功したテスト結果 失敗したテスト結果

プロジェクトがすべてチェックインされている場合、上のメッセージは表示されません。

前のメッセージが表示された後に、プロジェクト名が表示されます。それぞれのプロジェクト名は別個の行に表示されます。

問題の修正方法

チェックアウトされているプロジェクトをすべてチェックインします。

Project Server 2003 でチェックアウトされているプロジェクトをチェックインする

  1. Project Server 2003 Project Web Access で、[管理] をクリックします。

  2. [エンタープライズ機能の管理] をクリックします。

  3. [エンタープライズ プロジェクトのチェックイン] をクリックし、チェックアウトされているプロジェクトを確認します。そのプロジェクトをチェックインするか、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)
何らかの結果が返された場合、参照されているプロジェクトはチェックアウトされています。

プロジェクトが外部で編集されているかどうかを確認する

プロジェクトが外部で編集されている場合、そのプロジェクトは移行できません。

問題の確認方法

-verify オプションを指定して移行ツールを実行したときに、移行するプロジェクトが外部で編集されていると、コンソールとログに次のメッセージが表示されます。

次のプロジェクトはチェックアウトされています。これらのプロジェクトは移行ツールによって移行されません (移行ツールは停止せずに、これらのプロジェクトをスキップするだけです)。これらをチェックインしてください。

成功したテスト結果 失敗したテスト結果

すべてのプロジェクトが外部で編集されていない場合、上のメッセージは表示されません。

前のメッセージが表示された後に、プロジェクト名が表示されます。それぞれのプロジェクト名は別個の行に表示されます。

問題の修正方法

外部で編集されたプロジェクトを Project Professional 2003 で開いて保存し、サーバーにチェックインして戻します。これによって、[外部で編集] フラグが [false] に設定されます。

[!メモ] "Project Server 2003 プロジェクト テーブル" データベースと "Project Server 2003 Web テーブル" データベースで次の SQL スクリプトを実行して、外部で編集されたプロジェクトがないかどうかを調べることもできます。
select PROJ_NAME from dbo.MSP_PROJECTS where (PROJ_EXT_EDITED = 1 or RESERVED_BINARY_DATA is null) and PROJ_TYPE in (0, 1)

何らかの結果行が返された場合、参照されているプロジェクトは外部で編集されています。

プロジェクトに保留中の進捗の更新があるかどうかを確認する

既定では、Project Server 2003 プロジェクトに保留中の更新があると、Office Project Server 2007 に移行しません。移行前に、ユーザーに進捗の更新を承諾または却下してもらい、プロジェクトを移行するための安定した状態にすることをお勧めします。

問題の確認方法

-verify オプションを指定して移行ツールを実行するときに、プロジェクトに保留中の進捗の更新があると、コンソールとログに次のメッセージが表示されます。

次のプロジェクトはチェックアウトされています。これらのプロジェクトは移行ツールによって移行されません (移行ツールは停止せずに、これらのプロジェクトをスキップするだけです)。これらをチェックインしてください。

成功したテスト結果 失敗したテスト結果

すべてのプロジェクトに保留中の進捗の更新がない場合、前のメッセージは表示されません。

前のメッセージが表示された後に、プロジェクト名が表示されます。それぞれのプロジェクト名は別個の行に表示されます。

問題の修正方法

保留中の更新があるプロジェクトの移行ができるように、移行構成ファイルの StopProjectMigrationIfStatusUpdatesPending パラメータを構成します。このパラメータの詳細については、「Project Server の移行ツールを構成する」を参照してください。

移行前の手順として、プロジェクト管理者が特定の日付までに保留中の進捗の更新を承諾または却下する期限を設定することをお勧めします。その日付を過ぎたら、(進捗の更新が行われていない場合でも) すべてのプロジェクトを強制的に移行します。

[!メモ] "Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行して、保留中の進捗の更新があるプロジェクトがないかどうかをチェックすることもできます。
select distinct PROJ_NAME from dbo.MSP_WEB_ASSIGNMENTS wa, dbo.MSP_WEB_TRANSACTIONS trans, dbo.MSP_WEB_PROJECTS wp where wa.WPROJ_ID = wp.WPROJ_ID and trans.WASSN_ID = wa.WASSN_ID and trans.WTRANS_STATE in (0, 1, 2)
返される結果がある場合、参照されているプロジェクトには保留中の進捗の更新があります。

重複したエンタープライズ リソースがあるかどうかを確認する

Project 2003 または Project 2007 では、エンタープライズ リソース共有元に同じ名前のリソースを複数持つことはできません。この状況が発生している場合、データベースを直接編集した結果であることがあります。エンタープライズ リソース共有元を編集しているときには、重複した名前が Project Professional に表示されない場合があることに注意してください。これは、エンタープライズ リソースの MSP_WEB_RESOURCES テーブルに、この名前のエントリが 1 つしかないために発生します。この状況を解決する簡単な方法はありません。Project Server の専門家と共同で解決してください。重複したエンタープライズ リソースによって発生する問題がないかどうかをチェックして修正するための、いくつかのガイドラインを次に示します。

問題の確認方法

-verify オプションを指定して移行ツールを実行するときに、重複したエンタープライズ リソースが存在していると、コンソールとログに次のメッセージが表示されます。

エンタープライズ リソース共有元に、次のリソースの重複したエントリが含まれます。このシナリオは Project 2003 ではサポートされておらず、エンタープライズ リソースの移行が失敗することがあります。重複したリソースがないことを移行前に確認してください。

成功したテスト結果 失敗したテスト結果

重複したエンタープライズ リソースがない場合、前のメッセージは表示されません。

前のメッセージが表示された後に、リソース名が表示されます。それぞれのリソース名は別個の行に表示されます。

[!メモ] Project Server 2003 プロジェクト テーブルで次の SQL クエリを実行して、重複したエンタープライズ リソースがないかどうかをチェックすることもできます。このクエリによって、エンタープライズ リソース共有元内の重複したエンタープライズ リソースすべての一覧が生成されます。
クエリ 1:
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
スクリプトによって重複したエンタープライズ リソースが見つかると、2 つの重複したリソースがある次の例と同様のデータが表示されます。

RES_UID RES_NAME RES_EUID

123

Peter Krebbs

123

124

Peter Krebbs

123

125

Brad Sutton

125

126

Brad Sutton

126

重複したエンタープライズ リソースがプロジェクトで使用されているかどうかをチェックする

次の SQL クエリでは、プロジェクトで重複したエンタープライズ リソースが使用されていないかをチェックします。後の説明でこのクエリを参照するため、このクエリをクエリ 2 と呼びます。

クエリ 2:

select  distinct 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 and res_euid is not null  order by res_name, res_euid asc

クエリを実行すると、プロジェクトで使用されている重複したエンタープライズ リソースの一覧が表示されます。リソース名ごとに 1 行しか表示されない場合は、「適切なリソースを指すように重複したエンタープライズ リソースを修正する」に記載されているクエリ 4 を実行します。リソース名ごとに複数行が表示される場合は、「重複したエンタープライズ リソースを使用するプロジェクトを修正する」に記載されているクエリ 3 を実行します。

次の例で、プロジェクトで "Brad Sutton" という重複したインスタンスが使用されていることに注意してください。これを修正する必要があります。

RES_NAME RES_EUID

Peter Krebbs

123

Brad Sutton

125

Brad Sutton

126

重複したエンタープライズ リソースを使用するプロジェクトを修正する

次のクエリ (クエリ 3) を実行すると、重複しているエンタープライズ リソースに関連付けられているプロジェクト ID が返されます。このような重複をなくして、プロジェクトでは "res_name, res_euid" という組合せが 1 つだけ使用されるようにする必要があります。重複が存在する場合は、重複したいずれかのリソースを "適切な" リソースと指定し、すべてのプロジェクトでこのリソースを使用する必要があります (そのプロジェクトの MSP_RESOURCES.RES_EUID 列を更新して、適切なエンタープライズ リソースだと指定したリソースを指すようにする必要があります)。その後でクエリ 2 を実行し、重複したエンタープライズ リソースがプロジェクトで使用されていないかの確認テストを繰り返してください。

クエリ 3:

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

たとえば、クエリ 3 を実行したら次の結果が返されたとします。

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 オプションを指定して移行ツールを実行し、重複したリソースの問題が解決されていることを確認します。

移行の問題に対して手動のテストを実行する

-verify オプションを指定して移行ツールを実行すると、移行が失敗する原因となる問題がないか、Project Server 2003 データを自動的にチェックできます。これらのチェックは、(-verify オプションでは確認できない他のチェックと同様に) 手動でも実行できます。実行できる自動チェックについては、この記事の前半で説明しています。記事の残りの部分では、移行に備えて Project Server 2003 データの手動チェックを実行する方法について説明します。

Project のバージョンを最低でも "Project Server 2003 SP2a" にする

Project Server 2003 SP2a からの移行がサポートされています。この Service Pack がインストールされていない場合は適用する必要があります。Service Pack の詳細については、マイクロソフト サポート技術情報の記事「Description of Project Server 2003 Service Pack 2a」(https://go.microsoft.com/fwlink/?linkid=78242\&clcid=0x411) を参照してください。

問題の確認方法

"Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行します。このクエリによって、Service Pack の番号を含め、Project Server のバージョンがわかります。

select replace(str(WADMIN_VERSION_MAJOR)+'.'+str(WADMIN_VERSION_MINOR),' ','') as 'Project Server Version' from dbo.MSP_WEB_ADMIN

成功したテスト結果 失敗したテスト結果

11.2

11.1

問題の修正方法

インストール済みの Project Server 2003 に Project Server 2003 SP2a を適用します。Project Server 2003 SP2a の適用の詳細については、「Project Server 2007 への移行を準備する」を参照してください。

エンタープライズ グローバル テンプレートを外部で編集しない

エンタープライズ グローバル テンプレートがプロジェクトの外部で (たとえば、サード パーティ アプリケーションによって) 編集されると、[外部で編集] フラグが [true] に設定されます。Project Professional はこのフラグを調べます。フラグが [true] に設定されている場合、Project Professional は一貫性を保持するためにエンタープライズ グローバル テンプレートのデータをすべて再計算します。移行を可能にするには、このフラグを [false] に設定する必要があります。

問題の確認方法

"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。このクエリは、外部で編集されたプロジェクトがないか、Project Server 2003 データベースをチェックします。返される行がある場合、現在の状態でエンタープライズ グローバル テンプレートを移行することはできません。

select PROJ_NAME from dbo.MSP_PROJECTS where (PROJ_EXT_EDITED = 1 or RESERVED_BINARY_DATA is null) and PROJ_TYPE = 2

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。

問題の修正方法

Project Professional でエンタープライズ グローバルを開き、保存し直します。

エンタープライズ グローバル テンプレートがチェックアウトされているかどうかを特定する

プロジェクトを移行するときには、エンタープライズ グローバル テンプレートがチェックアウトされていてはいけません。

問題の確認方法

次の SQL クエリでは、エンタープライズ グローバルがチェックアウトされているかどうかが確認されます。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。

select count(*) from dbo.MSP_PROJECTS where PROJ_CHECKEDOUT = 1 and PROJ_TYPE = 2

成功したテスト結果 失敗したテスト結果

0

"0" より大きい値が返されます。

問題の修正方法

エンタープライズ グローバルがチェックインされていることを確認します。

  1. Project Server 2003 Project Web Access で、[管理] をクリックします。

  2. [エンタープライズ機能の管理] をクリックします。

  3. [エンタープライズ プロジェクトのチェックイン] をクリックし、エンタープライズ グローバルをチェックアウトしたユーザーを確認します。そのプロジェクトがチェックインされるようにユーザー間で調整するか、Project Web Access から強制チェックイン操作を実行します。

エンタープライズ グローバル テンプレートがロックされているかどうかを特定する

コンピュータで異常シャットダウンが発生したり、Project Professional が異常終了すると、プロジェクトはロックされます。エンタープライズ グローバル テンプレートがロックされていると、移行ツールを実行できません。

問題の確認方法

次の SQL クエリは、エンタープライズ グローバル テンプレートのファイルがロックされているかどうかをチェックします。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。

select cast(isnull(PROJ_LOCKED, '0') as int) from dbo.MSP_PROJECTS where PROJ_TYPE = 2

成功したテスト結果 失敗したテスト結果

0

1

問題の修正方法

次の 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 プロジェクト テーブル データベースの既定の言語が一致している必要があります。

問題の確認方法

このクエリで、各データベースの既定の言語を特定します。クエリの結果が一致しないと、移行に失敗します。 "Project Server 2003 プロジェクト テーブル" データベースと "Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行します。

select WADMIN_DEFAULT_LANGUAGE from dbo.MSP_WEB_ADMIN.

成功したテスト結果 失敗したテスト結果

2 つのデータベースでの実行結果が一致しています。

2 つのデータベースでの実行結果が一致していません。

問題の修正方法

管理者と協力して、2 つのデータベース間で一貫性がない状態を修正します。

リソース名にコンマが含まれているかどうかを特定する

どの言語でもエンタープライズ リソース名にコンマ文字 (.) を含めることができないことは、Office Project Server 2007 の制限です。この文字を有効な文字で置き換える必要があります。

問題の確認方法

このクエリで、コンマ文字を含むリソース名がないか、エンタープライズ リソース共有元をチェックします。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。

select RES_NAME from MSP_RESOURCES where RES_NAME is not null and charindex(',', RES_NAME) > 0

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。

問題の修正方法

"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 など) に値が設定されていないエンタープライズ リソースがあると、移行は失敗します。移行中に、移行ログにエラーが記録されます。このシナリオが発生していないか、移行前に確認することをお勧めします。エンタープライズ リソースが非常に古いか (ユーザー設定フィールドを "必須" とする前に作成されている)、無効になっている場合、必須ユーザー設定フィールドの値が入っていないことがあります。

この状況を修正する 1 つの方法は、すべての Office Project Server 2007 リソースのユーザー設定フィールドを [必須としない] に設定することです。これによって、Office Project Server 2007 で手動で元に戻すことができます。

移行の問題の原因となっているユーザー設定フィールドを見つけるために使用できる、2 つの検証方法があります。

  • 検証方法 1 では、"Project Server 2003 プロジェクト テーブル" データベースで SQL クエリを実行します。

  • 検証方法 2 では、Project Professional 2003 のユーザー インターフェイスを使用します。

検証方法 1 を使用して問題を確認する方法

この SQL クエリでは、エンタープライズ リソースの必須ユーザー設定フィールドに値が入っていないリソースが返されます。"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。

declare @eglobal_proj_id int

set @eglobal_proj_id = (select PROJ_ID from dbo.MSP_PROJECTS where PROJ_TYPE = 2)

select

   r1.RES_NAME as 'Resource Name',

   ast1.AS_VALUE as 'Custom Field Name'

from

   dbo.MSP_RESOURCES r1

   inner join dbo.MSP_CODE_FIELDS cf1 on (r1.RES_UID = cf1.CODE_REF_UID)

   inner join dbo.MSP_FIELD_ATTRIBUTES fa1 on (cf1.CODE_FIELD_ID = fa1.ATTRIB_FIELD_ID)

   inner join dbo.MSP_ATTRIBUTE_STRINGS ast1 on (fa1.AS_ID = ast1.AS_ID)

   inner join dbo.MSP_OUTLINE_CODES oc3 on (cf1.CODE_UID = oc3.CODE_UID and oc3.PROJ_ID = @eglobal_proj_id)

   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

   r1.PROJ_ID = 1

   and cf1.proj_id = 1

   and fa1.PROJ_ID = @eglobal_proj_id

   and fa1.ATTRIB_ID = 206

   and ast1.PROJ_ID = @eglobal_proj_id

   and oc3.PROJ_ID = @eglobal_proj_id

   and oc1.CODE_UID is null

   and oc2.CODE_UID is null

order by

   r1.RES_NAME,

   ast1.AS_VALUE

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。

問題の修正方法

Project Server 2003 でエンタープライズ リソース共有元を開き、必須ユーザー設定フィールドの値を設定するか、値が入っていないユーザー設定フィールドを [必須としない] に設定します。

検証方法 2 を使用して問題を確認する方法

この方法では、Project Professional 2003 を使用してエンタープライズ リソース共有元を開く必要があります。エンタープライズ リソース共有元の保存を試みることで、選択したすべてのエンタープライズ リソースの必須ユーザー設定フィールドに値が入っているかどうかが確認されます。

  1. Project Server 2003 サーバーに接続されている Project Professional 2003 を開きます。

  2. [ツール] メニューの [エンタープライズ オプション] をポイントし、[エンタープライズ リソース共有元を開く] をクリックします。

  3. 表示される [エンタープライズ リソース共有元を開く] ダイアログ ボックスで、[無効なリソースを含める] チェック ボックスをオンにします。[編集モードでチェックアウト] がオンであることを確認します。[フィルタの適用] をクリックします。

  4. [すべて選択/すべて解除] をクリックして、リソースがすべて選択されるようにします。

  5. [開く/追加] をクリックします。編集のためにリソースが開かれたら、[保存] をクリックします。Project Professional により、各エンタープライズ リソース (アクティブまたは非アクティブ) の必須ユーザー設定フィールドに値が入っているかどうかが確認されます。

    成功したテスト結果 失敗したテスト結果

    保存後にエラー メッセージは表示されません。

    エラー メッセージが表示され、エンタープライズ リソースの必須ユーザー設定フィールドに値が入っていないリソースのエラーが一覧で示されます。

問題の修正方法

Project Server 2003 で、必須ユーザー設定フィールドの値を設定するか、値が入っていないユーザー設定フィールドを [必須としない] に設定します。

リソースのユーザー設定フィールドに、参照テーブルの定義にない値が入っているかどうかを特定する

リソースのユーザー設定フィールドの値は、すべて参照テーブルの定義に入っている必要があります。

問題の確認方法

この SQL クエリにより、ユーザー設定フィールドの値が対応する参照テーブル内にあるかどうかをチェックすることで、リソースのユーザー設定フィールドが無効かどうかをチェックします。

"Project Server 2003 プロジェクト テーブル" データベースと "Project Server 2003 Web テーブル" データベースで次の SQL クエリを実行します。

declare @eglobal_proj_id int

set @eglobal_proj_id = (select PROJ_ID from dbo.MSP_PROJECTS where PROJ_TYPE = 2)

select

   r1.RES_NAME,

   ast1.AS_VALUE

from

   dbo.MSP_RESOURCES r1

   inner join dbo.MSP_CODE_FIELDS cf1 on (r1.RES_UID = cf1.CODE_REF_UID)

   inner join dbo.MSP_FIELD_ATTRIBUTES fa1 on (cf1.CODE_FIELD_ID = fa1.ATTRIB_FIELD_ID)

   inner join dbo.MSP_ATTRIBUTE_STRINGS ast1 on (fa1.AS_ID = ast1.AS_ID)

   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

   r1.PROJ_ID = 1

   and cf1.proj_id = 1

   and cf1.code_uid is not null

   and fa1.PROJ_ID = @eglobal_proj_id

   and fa1.ATTRIB_ID = 206

   and ast1.PROJ_ID = @eglobal_proj_id

   and oc1.CODE_UID is null

   and oc2.CODE_UID is null

union

select

   r1.RES_NAME,

   ast1.AS_VALUE

from

   dbo.MSP_RESOURCES r1

   inner join dbo.MSP_MV_FIELDS cf1 on (r1.RES_UID = cf1.CODE_REF_UID)

   inner join dbo.MSP_FIELD_ATTRIBUTES fa1 on (cf1.CODE_FIELD_ID = fa1.ATTRIB_FIELD_ID)

   inner join dbo.MSP_ATTRIBUTE_STRINGS ast1 on (fa1.AS_ID = ast1.AS_ID)

   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

   r1.PROJ_ID = 1

   and cf1.proj_id = 1

   and cf1.code_uid is not null

   and fa1.PROJ_ID = @eglobal_proj_id

   and fa1.ATTRIB_ID = 206

   and ast1.PROJ_ID = @eglobal_proj_id

   and oc1.CODE_UID is null

   and oc2.CODE_UID is null

order by

   r1.RES_NAME,

   ast1.AS_VALUE

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。

問題の修正方法

次の 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 にエンタープライズ リソースを移行するには、それらのリソースが外部で編集されていてはいけません。

問題の確認方法

次のクエリで、エンタープライズ リソースのエンタープライズ リソース共有元が外部で編集されているかどうかをチェックします。テスト結果が失敗の場合、現在の状態ではエンタープライズ リソース共有元を移行できません。"Project Server 2003 プロジェクト テーブル" で次の SQL クエリを実行します。

select count(*) from dbo.MSP_RESOURCES  where PROJ_ID = 1 and  cast(EXT_EDIT_REF_DATA as varchar(1)) = '1'

成功したテスト結果 失敗したテスト結果

0

"0" より大きい値が返されます。

問題の修正方法

問題を解決するには、最初に、すべてのエンタープライズ リソースが外部で編集されると設定する必要があります。この設定は SQL クエリによって実行できます。その後で、エンタープライズ リソース共有元が保存されるときに、関連する更新が Project Professional によってすべて行われるように、それぞれのエンタープライズ リソースに変更を加えることができます。この操作によって、各エンタープライズ リソースの [外部で編集] フラグが削除されます。エンタープライズ リソースが変更されていなければ、Project Professional はそのリソースに対する再計算を行いません。これに該当するエンタープライズ リソースには引き続き [外部で編集] フラグが設定され、エンタープライズ リソース共有元が移行されません。

[!メモ] エンタープライズ リソース共有元が移行されたら、各エンタープライズ リソースに加えた変更を削除できます。

次の一般的な回避策を使用して、外部で編集されたすべてのフラグをエンタープライズ リソースから削除できます。

  1. すべてのエンタープライズ リソースを、外部で編集される設定にします。"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

  2. それぞれのエンタープライズ リソースに、重要でないリソースのユーザー設定フィールドを一時的に追加し、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 プロジェクト テーブル" データベースで次の SQL クエリを実行します。

declare @proj_id int

set @proj_id = (select proj_id from msp_projects where proj_type = 2)

select ats.as_value as CustomFieldName from msp_attribute_strings ats

inner join msp_field_attributes fa on (fa.proj_id = ats.proj_id and fa.as_id = ats.as_id)

where fa.attrib_id = 206 and fa.proj_id = @proj_id and fa.attrib_field_id >= 205521382 and fa.attrib_field_id <= 205521391

and exists (select * from msp_field_attributes fa2 where fa2.proj_id = fa.proj_id and fa2.attrib_field_id = fa.attrib_field_id and fa2.attrib_id = 210)

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。これらの "エンタープライズ リソース期間" ユーザー設定フィールドには、関連付けられている値リストがあります。値リストはフィールドごとに手動で削除する必要があります。

問題の修正方法

問題を解決するには、SQL クエリで見つかったそれぞれの "エンタープライズ リソース期間" ユーザー設定フィールドから、すべての値リストを手動で削除する必要があります。これは、次の手順に従って行うことができます。

  1. Project Server 2003 サーバーに接続されている Project Professional 2003 を開きます。

  2. [ツール] メニューの [エンタープライズ オプション] をポイントし、[エンタープライズ グローバルを開く] をクリックします。

  3. [Microsoft Project - エンタープライズ グローバル - チェックアウト] ページで、[ツール] メニューの [ユーザー設定] をポイントし、[エンタープライズ フィールド] をクリックします。

  4. [エンタープライズ フィールドのユーザー設定] ページの [フィールドのユーザー設定] タブで、[フィールド] の [リソース] をクリックします。

  5. [種類] ボックスの一覧の [期間] をクリックします。[フィールド] ボックスの一覧に、すべての "エンタープライズ期間" ユーザー設定フィールドが表示されます。

  6. [フィールド] ボックスの一覧で、前に実行した SQL クエリによって返されたものと一致する最初の "エンタープライズ リソース期間" ユーザー設定フィールドを選択します。[属性] セクションで、[値リスト] をクリックします。特定の "エンタープライズ期間" ユーザー設定フィールドの値リストで、[] 列の値をすべて削除し、[OK] をクリックします。表示された Microsoft Office Project のダイアログ ボックスで、[OK] をクリックします。

  7. [エンタープライズ フィールドのユーザー設定] ページの [属性] セクションで、[フィールド] ボックスの一覧で選択した "エンタープライズ リソース期間" ユーザー設定フィールドの [値リスト] が選択されていないことを確認します。[値リスト] が選択されている場合は、[なし] を選択します。

  8. [フィールド] ボックスの一覧で、SQL クエリに対応する残りの "エンタープライズ リソース期間" ユーザー設定フィールドをすべて選択し、手順 6. と手順 7. を繰り返します。

  9. [OK] をクリックします。

"エンタープライズ リソース期間" ユーザー設定フィールドに有効な値が含まれているかどうかを特定する

Office Project Server 2007 では、負の期間の値や、34689600 より大きい期間の値は使用できません。どちらかを含む Project Server 2003 "エンタープライズ リソース期間" ユーザー設定フィールドを移行しようとすると、移行に失敗します。

問題の確認方法

問題があるかチェックするには、"Project Server 2003 プロジェクト テーブル" データベースで次の SQL クエリを実行します。このクエリでは、無効な値が入っている "エンタープライズ リソース期間" ユーザー設定フィールドが返されます。

select r.res_name, mas.as_value from msp_resources r

inner join msp_duration_fields df on (df.dur_ref_uid = r.res_euid and df.proj_id = r.proj_id)

inner join msp_projects p on (p.proj_type = 2)

inner join msp_field_attributes fa on (fa.proj_id = p.proj_id and fa.attrib_field_id = df.dur_field_id)

inner join msp_attribute_strings mas on (mas.proj_id = p.proj_id and fa.as_id = mas.as_id)

where (dur_value < 0 or dur_value > 34689600) and df.proj_id = 1 and p.proj_type = 2 and fa.attrib_id = 206

成功したテスト結果 失敗したテスト結果

返される行がありません。

1 行以上の行が返されます。

問題の修正方法

問題を解決するには、識別されたユーザー設定フィールドごとに、"エンタープライズ リソース期間" ユーザー設定フィールドの値を手動で編集する必要があります。フィールドの値は、有効 (0 ~ 34689600) であるようにする必要があります。

クエリによって識別されたフィールドが、単純なユーザー設定フィールド (数式フィールドではない) である場合は、許容範囲内でフィールドの値を変更できます。クエリによって識別されたフィールドが数式フィールドである場合は、結果が有効な範囲内になるように数式を変更する必要があります。

エンタープライズのユーザー設定フィールド名の先頭または末尾にスペースが含まれていないか特定する

Office Project Server 2007 のユーザー設定フィールド名で先頭または末尾のスペースが含まれないことを確認します (たとえば、__Custom Field_、ここでアンダースコア文字はスペース文字を表します)。先頭または末尾にスペースのあるユーザー設定フィールドを移行しようとすると、移行はエラーで失敗します。

移行管理者アカウントが Project Server 2003 に存在するかどうかを確認する

"移行管理者アカウント" が (名前または Windows アカウントとして) Project Server 2003 に存在する場合、これらのユーザー権限、カテゴリのマッピングなどのユーザー プロパティは Office Project Server 2007 に移行されません。基本的に、Office Project Server 2007 ユーザーが優先されます。"移行管理者アカウント" がプロジェクトで使用されていると、これらのリソースは "移行管理者アカウント" で置き換えられることに注意してください。

エンタープライズ リソース名のコンマ文字を置換する

Project Server 2003 データベースにコンマ文字を含むエンタープライズ リソース名がある場合、リソースの移行は失敗します。これは、リソース名にコンマ文字を使用するのが一般的な慣行になっている特定のロケールの顧客の問題と考えられます。

問題の修正方法

次の SQL クエリを使用して、各コンマ文字をニュートラル アンダースコア文字に置き換えます。

プロジェクト テーブル データベースで次のクエリを実行します。

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

Web テーブル データベースで次のクエリを実行します。

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