自动将项目声明为记录会导致 SharePoint Server 中出现重复项

原始 KB 数: 2905419

症状

使用 Microsoft SharePoint Server 2010 或 Microsoft SharePoint Server 2013 中的记录中心模板创建网站集。 将新内容更新到此网站集中的默认 Drop Off 库时,会收到以下错误消息:

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

Microsoft SharePoint Server 2013:
很抱歉,出现问题。
无法删除、移动或重命名此项,因为它要么处于保留状态,要么是阻止删除的记录。

上传的项会自动声明为记录,并按照内容组织规则的配置复制到目标库之一。 如果尝试从相应的 Drop Off 或记录库中删除这些复制的项,也会看到此错误。

即使尝试在 “合规性详细信息” 部分中取消声明此项,此项目的声明状态也不会更改。 如果在 Drop Off 库中编辑此项,即使没有任何更改并提交,则会在记录库中创建新的重复项。 此重复项的名称追加了唯一的自动生成 ID。

如果禁用项的自动声明并启用项的手动声明,则可以删除 Drop off 库中的项。 但是,记录库中的项将保留为无法删除的重复项。

原因

这是因为将项从一个库移到另一个库的操作在两个阶段中完成。 首先,它从源复制到目标,然后从源中删除它。 在这种情况下,源是 Drop Off 库,一旦上传项,就会将项声明为记录。 由于项声明为 Drop Off 库中的记录,因此无法删除它们。 上传后,内容组织者规则将运行以将项目移动到其目标。 这会成功完成复制操作,并且项目可在目标处使用。 但是,由于它已声明,因此无法在 Drop Off 库中删除该项。 如果尝试删除此项,将导致出现前面提到的错误。

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

当 Drop Off 库更改为允许手动声明记录时,可以在取消声明这些项后将其删除。 更改记录库中的项时,无法删除该项,因为库不会更改此项的声明状态。

解决方案

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

更新 Drop Off 库,使其不会自动将项目声明为记录。 Drop Off 库用于将文档拖放到一个位置,该位置可能受许多内容组织者规则的约束。

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

步骤 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 名称>替换为<正确的值。

    在此输出中,计算事件接收器类型的位置 ItemDeleting ,方法是从顶部开始作为位置数字 0,同时递增下一个事件接收器的序列。

    例如,在以下输出中, 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此方法提供 和 AssemblyclassName 可以创建事件接收器。