自动将项目声明为记录会导致服务器SharePoint重复

原始 KB 编号:   2905419

症状

您可以使用 2010 年 10 月或 2013 Microsoft SharePoint Server记录中心Microsoft SharePoint Server网站集。 当您将新内容更新为此网站集中的默认放置库时,您将收到以下错误消息:

Microsoft SharePoint Server 2010:错误
无法删除、移动或重命名此项目,因为它位于保留状态或阻止删除的记录。

Microsoft SharePoint Server 2013 年 10 月:
抱歉,出错了。
无法删除、移动或重命名此项目,因为它位于保留状态或阻止删除的记录。

上载的项目将自动声明一条记录,并按内容管理器规则的配置复制到其中一个目标库。 如果您尝试从各自的放置或记录库中删除这些复制的项目,也会看到此错误。

即使尝试在"合规性详细信息"部分取消声明,此项的声明状态也 不会改变 。 如果在放置库中编辑此项,即使没有任何更改,也无需提交,将在记录库中创建一个新的重复项。 此重复项的名称附加有唯一自动生成的 ID。

如果禁用项目的自动声明并启用项目的手动声明,则删除放置库中的项目。 但是,记录库中的项仍保留为无法删除的重复项。

原因

这是因为项目从一个库移动到另一个库的操作分两个阶段完成。 首先,将其从源复制到目标,然后从源中删除。 在这种情况下,源是放置库,并且它会在项目上载后将其声明为记录。 由于这些项目在放置库中声明为记录,因此无法删除。 上载后,内容管理器规则将运行以将项目移动到其目标。 此操作成功完成复制操作,并且项目在目标位置可用。 但是,由于该项目是声明的,因此无法在放置库中删除该项目。 如果您尝试删除此项目,则会导致前面提到的错误发生。

编辑项目属性会导致组织者规则再次运行,并重复此过程。 这次,由于文档已存在于目标中,因此项目名称的后缀为唯一 ID。

当放置库更改为允许手动声明记录时,可以在取消声明之后删除这些项目。 当记录库中的项目发生更改时,无法删除该项,因为库不会更改此项目的声明状态。

解决方案

步骤 1:修复放置库重复项

更新放置库,以便它不会自动将项目声明为记录。 放置库用于将文档放置到可受许多内容管理器规则限制的一个位置。

这将确保上载到放置库的任何新项不会导致重复或引发错误。 启用放置库中记录的手动声明,以便可以在取消声明现有文档并清理放置库后删除它们。

步骤 2 修复记录库重复项

若要修复记录库中的现有重复项,请按照以下步骤操作:

  1. 删除在项目删除操作期间运行的事件接收器。
  2. 删除重复的记录。
  3. 重新添加事件接收器。

下一节将详细列出这些步骤:

重要

删除在删除尝试期间运行的事件接收器将允许删除任何文档。 这包括不应删除的任何合法文档。 首先在测试环境中测试这些步骤。 采取极端预防措施,确保用户在此练习中无法使用该网站,以便用户不会删除任何其他文档。

  1. 在SharePoint命令行管理程序中,运行以下脚本并列出所有事件接收器:

    $problemweb = Get-SPWeb http://<Your Site Collection>
    $problemlist = $problemweb.Lists["<Record Library Name>"]
    $problemlist.EventReceivers | select type, name
    

    备注

    必须将 和 <YourSiteCollection> <Rocrdr Listbrayt name> 替换为正确的值。

    在此输出中,通过从位置编号为 0 的顶端开始计算事件接收器类型的位置,同时递增下一个事件 ItemDeleting 接收器的序列。

    例如,在下面的输出中,事件接收器 ItemDeleting 在数组中位于第二个位置。 因此,位置号为 1,因为数组从 0 开始:

    Type Name
    ---- ----
    ItemUpdating ECM_RecordEventReceiver
    ItemDeleting ECM_RecordEventReceiver
    ItemFileMoving ECM_RecordEventReceiver
    ItemAdded Document ID Generator
    ItemAdded ECM_RecordEventReceiver
    ItemUpdated Document ID Generator
    ItemUpdated ECM_RecordEventReceiver
    ItemCheckedIn Document ID Generator
    ItemCheckedIn ECM_RecordEventReceiver
    ItemUncheckedOut Document ID Generator
    
  2. 确保数组位置指向 ItemDeleting 事件接收器:

    $problemev = $problemlist.EventReceivers[Position of the "ItemDeleting" event receiver]
    

    例如:

    $problemev = $problemlist.EventReceivers[1]
    
  3. 删除 ItemDeleting 事件接收器:

    $problemev.Delete()
    
  4. 更新列表:

    $problemlist.update()
    
  5. 使用浏览器从记录库中删除重复项。

  6. 运行以下脚本以重新创建 ItemDeleting 事件接收器:

    $problemevadded = $problemlist.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemDeleting,"Microsoft.Office.Policy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c","Microsoft.Office.RecordsManagement.Internal.HoldEventReceiver")
    $problemlist.update()
    

更多信息

事件接收器 ItemDeleting 的类型 SPEventReceiver 为 。 通过 receiverType 使用此方法提供 和 , Assembly className 可以创建事件接收器。