迁移前的验证和清理

更新时间: 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 打开这些项目并将其保存回 Project Server 2003

成功的测试结果 不成功的测试结果

如果尚未从外部编辑所有项目,则不会显示上述消息。

将显示上述消息,后跟项目名称。每个项目名称占一行。

如何解决该问题

在 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 表中可能只有一个与具有此名称的企业资源相对应的项。这种情况不太容易处理,请与 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
如果该脚本找到任何重复的企业资源,则显示的数据类似于下面包含两个重复资源的示例。

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

运行该查询后,会生成项目中使用的重复企业资源的列表。如果您看到每个资源名称只占用一行,请运行查询 4(位于“修复重复的企业资源,使其指向正确的资源”部分)。如果您看到每个资源名称占用多行,请运行查询 3(位于“修复使用重复的企业资源的项目”部分)。

请注意在下面的示例中,项目使用了重复的实例“Brad Sutton”。需要解决此问题。

RES_NAME RES_EUID

Peter Krebbs

123

Brad Sutton

125

Brad Sutton

126

修复使用重复的企业资源的项目

运行下面的查询(查询 3)将返回与重复的企业资源相关联的项目 ID。您需要消除这种类型的重复,以便只在您的项目中使用一个“res_name,res_euid”组合。如果存在重复项,则需要将其中一个重复项指定为“正确的”资源并确保所有项目均使用该资源。(更新该项目的 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”

Microsoft 支持从 Project Server 2003 SP2a 进行迁移。如果您未安装此 Service Pack,则需要应用它。有关该 Service Pack 的详细信息,请参阅名为 Project Server 2003 Service Pack 2a 说明 (https://go.microsoft.com/fwlink/?linkid=78242\&clcid=0x804) 的知识库文章。

如何检查该问题

对“Project Server 2003 Web 表”数据库运行下面的 SQL 查询。此查询会告知您 Project Server 的特定版本,包括 Service Pack 的编号。

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 SP2a 应用于您的 Project Server 2003 安装。有关应用 Project Server 2003 SP2a 的详细信息,请参阅准备迁移到 Project Server 2007

不应从外部编辑企业全局模板

如果在 Project 以外编辑企业全局模板(例如,通过第三方应用程序),则会将“从外部编辑”标志设置为“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

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。

如何解决该问题

在 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

确定 Web 表数据库与项目表数据库中的默认语言是否应相符

迁移前,Project Server 2003 Web 表与 Project Server 2003 项目表数据库中的默认语言必须相符。

如何检查该问题

下面的 SQL 查询可确定每个数据库的默认语言。如果查询结果不相符,迁移将失败。请对“Project Server 2003 项目表”和“Project Server 2003 Web 表”数据库运行下面的 SQL 查询。

select WADMIN_DEFAULT_LANGUAGE from dbo.MSP_WEB_ADMIN.

成功的测试结果 不成功的测试结果

在两个数据库上运行时结果相符。

在两个数据库上运行时结果不相符。

如何解决该问题

与管理员一起纠正两个数据库之间的不一致状态。

确定资源名称中是否包含逗号

任何语言的企业资源的名称中不能包含逗号 (,) 是 Office Project Server 2007 的一个限制。必须用有效字符替换该字符。

如何检查该问题

下面的 SQL 查询可检查企业资源库中包含逗号的所有资源名称。请对“Project Server 2003 项目表”数据库运行下面的 SQL 查询。

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

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。

如何解决该问题

请对“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)中不包含值,则无法迁移该企业资源。迁移过程中会在迁移日志中发布一条错误。建议您在迁移前检查这种情况。如果您的企业资源非常陈旧(是在自定义域成为“必填”项之前创建的)或处于非活动状态,则这些企业资源的必填自定义域可能不包含值。

解决此问题的一种方法是,确保将所有 Office Project Server 2007 资源自定义域设置为“可选”。然后,您可以在 Office Project Server 2007 中手动将其改回。

您可以使用两种验证方法来找出哪些自定义域会导致该迁移问题。

  • 验证方法 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

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。

如何解决该问题

在 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

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。

如何解决该问题

下面的 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 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”资源自定义域。您可以使用任何自定义域类型。例如,您可以使用并不常用的“资源工期”自定义域。

    提示

    如果您使用“企业资源工期”自定义域,请不要为其创建值列表,因为不会迁移包含值列表的“企业资源工期”自定义域。创建此临时自定义域时,请使用数值。

    您可以将新的自定义域命名为“测试资源 CF”。在创建“测试资源 CF”自定义域后,打开企业资源库并添加“测试资源 CF”列。为所有资源的此自定义域设置一个有效值。保存该企业资源库并执行迁移。迁移后,请移除 Microsoft Office Project Professional 2007 中的“测试资源 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)

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。这些“企业资源工期”自定义域包含与其相关联的值列表。必须手动为每个域移除值列表。

如何解决该问题

若要解决该问题,您必须手动从在 SQL 查询中找到的每个“企业资源工期”自定义域中移除所有值列表。您可以使用下面的步骤实现此目的。

  1. 打开连接到 Project Server 2003 服务器的 Project Professional 2003。

  2. 在“工具”菜单上,指向“企业选项”,然后单击“打开企业全局设置”。

  3. 在 Microsoft Project“签出企业全局设置”页上的“工具”菜单上,指向“自定义”,然后单击“企业域”。

  4. 在“自定义企业域”页上的“自定义域”选项卡上,在“域”部分中,单击“资源”。

  5. 在“类型”下拉列表中,单击“工期”。所有“企业工期”自定义域将出现在“域”列表中。

  6. 在“域”列表中,选择第一个“企业资源工期”自定义域,该域与您以前运行的 SQL 查询返回的域相符。在“自定义属性”部分,单击“值列表”按钮。在特定“企业工期”自定义域的值列表中,删除“值”列中的任何值,然后单击“确定”。在出现的 Microsoft Office Project 对话框中,单击“确定”。

  7. 在“自定义企业域”页上的“自定义属性”部分,确保没有为在“域”列表中选择的“企业资源工期”自定义域选择“值列表”。如果已选择“值列表”,请选择“无”。

  8. 在“域”列表中,选择与 SQL 查询相对应的其他所有“企业资源工期”自定义域,并重复步骤 6 和 7。

  9. 单击“确定”。

确定“企业资源工期”自定义域是否包含有效值

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

成功的测试结果 不成功的测试结果

不返回任何行。

返回一行或多行。

如何解决该问题

若要解决该问题,您必须手动编辑每个已确定自定义域的“企业资源工期”自定义域值。必须确保这些域值有效(介于 0 到 34689600 之间)。

如果查询确定的域是一个简单的自定义域(而非公式域),那么您可以更改此域的值以使其位于允许范围内。如果查询确定的域是一个公式域,则必须更改此公式以确保结果位于有效范围内。

确定企业自定义域名称中是否包含前导空格或尾随空格

验证 Office Project Server 2007 自定义域名称中是否包含任何前导空格或尾随空格(例如 __Custom Field_ ,其中下划线字符表示空格)。如果您尝试迁移包含前导空格或尾随空格的自定义域,则迁移将失败并出现错误。

确定 Project Server 2003 中是否存在迁移管理员帐户

如果 Project Server 2003 中存在“迁移管理员帐户”(依据名称或 Windows 帐户),则用户权限、类别映射和用户属性将不会迁移到 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