Sharepoint:列表导入后的查找字段的完整性

时间:2010-04-21 18:58:13

标签: sharepoint sharepoint-2007 import integrity

我在导入数据时遇到了有关查找字段行为的问题。我想知道当他们指向的列表被替换/导入时,查找字段的行为如何。为了解释这个问题,我将在下面提供一个简单的例子:

例如,假设我们有两个共享点列表:

Product Types
-------------
+ Type Name
+ Code Nr
+ etc


Products
--------
+ Product Name
+ Product Type (Lookup field to list "Product Types")
+ etc

在我的方案中,产品列表包含生产Sharepoint平台上的生产数据。它由业务用户填充数据。 但是,“产品类型”列表包含相当静态的数据,由开发人员维护。

现在,在开发周期之后,开发人员想要部署他的新webparts和他的新数据(产品类型列表)。开发人员执行以下过程:

  1. 在开发机器上:使用stsadm
  2. 导出“产品类型”列表
  3. 在生产机器上:删除“产品类型”列表中的所有项目
  4. 在生产计算机上:使用stsadm
  5. 导入“产品类型”列表

    这意味着我们基本上会替换生产服务器上的“产品类型”列表,同时保持“产品”列表不变。

    现在的问题是:

    • 这样安全吗?在某些情况下,查找引用是否会中断?
    • 此导入/导出程序的任何缺点?
    • 如果有人在导入过程中访问“产品”会怎样? (现在无效的)引用是否会清除其自己的内容(变为空值)。
    • 如果“产品类型”列表的架构发生变化(新列),会发生什么?这会引起任何麻烦吗?

    感谢所有反馈和建议!

    更新1 导入的“产品类型”项目具有与先前删除的ID相同的ID。

    更新2 开始获得奖励以获得更多反馈/意见。

2 个答案:

答案 0 :(得分:2)

之前我们有过完全相同的情况。这有点棘手,取决于你将如何接近它。

1)通过UI

删除并重新创建产品类型列表

如果您通过UI删除并重新创建查找列表(在您的案例中为产品类型),那么您将失去连接,因为List的id GUID将在重新创建时更改。所以不要走那条路。

2)通过功能删除和重新创建产品类型

如果 使用feature.xml元素通过<ListInstance>文件创建了“产品类型”列表,那么如果删除该列表,然后使用相同的功能重新创建它(基本上ListInstance的Id属性保持不变,列表项的数量,即<Row>元素的数量可能会改变),将保持关联。因此,如果您要添加另外5种产品类型,那么如果您使用某项功能创建了列表,则可以删除该列表并使用相同功能配置新列表,并为新项目提供额外信息,一切都会正常工作!

作为旁注,这是更好的方法,因为如果你必须在很多服务器上进行升级,那么通过stsadm进行列表导出导入,而不是功能停用和激活是一个更推荐的解决方案。这就是我们做到的。

3)从产品类型中删除所有列表项并添加新项目(列表永不删除)

如果要将查找字段(在产品列表中)链接到查找列表(产品类型)的ID字段,则必须记住ID是自动递增的,因此如果删除所有项目,则添加新的,然后他们的ID将是不同的。假设您在列表中有5个具有ID的项目(在数据库视图中编辑时,ID字段未在UI中显示)1-5。如果删除它们并添加新项目,它们的ID将从6开始,而不是从1开始。因此,如果您的查找字段已链接到其中包含ID 1的项目,则此方法不起作用,因为“产品类型”列表中不再存在ID为1的项目。因此,在使用此方法进行生产之前,您可能想要真正尝试一下。

4)在适当的位置编辑列表

如果列表不是非常庞大,并且您只需要对一个或两个实例进行此更改,那么您是否可以直接在prod服务器上的数据表视图中编辑列表?在数据表视图中进行编辑时,请勿删除该项,而只是覆盖其列的值。如果需要,您可以添加更多项目。这将确保您的ID有效。

我主要谈到在列表中添加新项目。现在,如果您要删除现有项目,那么您的查找字段将受到影响,因为假设您按ID链接了该字段,因此该项目已被删除后ID不再存在。基本上,您使用的任何方法,维护您的ID都是至关重要的。

现在关于你的疑惑/问题: 我不太确定stsadm export import for list(从来没有自己完成),但stsadm可能很棘手,因为某些操作只适用于某些范围。所以你最好在dev env上尝试你的确切场景。

根据确切的时间安排,导入过程中会发生什么变得棘手。我确信SP有自己的并发机制,但你不能有一个明确的答案,因为它可能会根据导入的阶段而有所不同。如果可能,建议的方法是在计划停机期间进行导入。

关于更改列表的架构,列表架构的更改不会影响现有列表实例(大多数情况下)。如果您通过UI执行此操作,我相信SP会直接更改内容数据库。我不确定您打算如何执行此操作,但如果您要使用功能向现有列表添加列,则执行此操作的方法是在功能激活期间向列表添加新内容类型并添加新列这种内容类型。这样就可以添加列,但不会影响现有的列表项。

祝你好运......

答案 1 :(得分:1)

特定查找有两个组件:字段和字段值。字段值仅包含其引用的项目的ID以及显示字段。没有该字段,此信息毫无意义,该字段指定要查看的列表以及用作显示字段的字段。

  • 在字段范围上发生查找将中断的主要原因:它引用的列表不再存在,或者列表不包含必填字段。如果删除并重新创建列表,通常会发生这些情况,但您没有这样做。如果确实打破了查找列表引用,那么您唯一能做的就是重新创建查找,因为一旦创建了查找字段,就无法配置列表引用。
  • 导入/导出过程的缺点是您丢失了所有当前存在的查找值的有效性。查找根据其引用的项的ID维护其完整性。因此,当显示字段更改时,它仍然引用相同的项目。如果删除该项,则查找不再引用它,即使您创建的新项目具有相同的显示字段值。因此,您必须将所有产品重新分配给新的产品类型。
    • 应该注意的是,如果您要还原该项目的删除,它将返回查找!保留对该ID的引用,直到更新实际查找值(例如通过编辑产品)。
  • 出于交互目的,所有现在无效的引用都将为null。您不会在显示表单上看到任何内容,并且在尝试更新产品时将无法使用这些选项。当您更新产品时,将其更新为您刚刚设置的产品,因为您无法设置不存在的ID,这意味着不再有对这些ID的引用。
  • 对产品类型列表架构的任何更改都不会影响为查找指定的显示字段,这对查找完整性没有任何影响。如果您以任何方式更改显示字段,当然如果您删除它,那么它将以与列表引用相同的方式中断。但是,您可以在UI和对象模型中设置显示字段,以便轻松解决此问题。