次の方法で共有


アイテムをレコードとして自動的に宣言すると、SharePoint Server で重複が発生する

元の KB 番号: 2905419

現象

サイト コレクションは、Microsoft SharePoint Server 2010 または Microsoft SharePoint Server 2013 のレコード センター テンプレートを使用して作成します。 このサイト コレクションの既定の Drop Off ライブラリに新しいコンテンツを更新すると、次のエラー メッセージが表示されます。

Microsoft SharePoint Server 2010: エラー
このアイテムは保留状態であるか、削除をブロックするレコードであるため、削除、移動、または名前変更することはできません。

Microsoft SharePoint Server 2013:
申し訳ございません。問題が発生しました。
このアイテムは保留状態であるか、削除をブロックするレコードであるため、削除、移動、または名前変更することはできません。

アップロードされたアイテムは自動的にレコードとして宣言され、コンテンツ オーガナイザー ルールの構成に従って、いずれかのコピー先ライブラリにコピーされます。 また、コピーしたこれらの項目をそれぞれの Drop Off ライブラリまたはレコード ライブラリから削除しようとすると、このエラーも表示されます。

[ コンプライアンスの詳細 ] セクションで宣言を解除しようとしても、この項目の宣言状態は変更されません。 変更を加えずにドロップオフ ライブラリでこの項目を編集して送信すると、レコード ライブラリに新しい重複アイテムが作成されます。 この重複する項目の名前には、一意の自動生成 ID が追加されます。

項目の自動宣言を無効にし、項目の手動宣言を有効にした場合、Drop off ライブラリの項目を削除できます。 ただし、レコード ライブラリの項目は、削除できない重複として残ります。

原因

これは、あるライブラリから別のライブラリへの項目の移動操作が 2 つのフェーズで完了するためです。 最初にソースからコピー先にコピーされた後、ソースから削除されます。 このような状況では、ソースは Drop Off ライブラリであり、アップロードされるとすぐにアイテムをレコードとして宣言します。 アイテムは Drop Off ライブラリ内のレコードとして宣言されているため、削除できません。 アップロード後、コンテンツ オーガナイザー ルールが実行され、アイテムが移動先に移動されます。 これにより、コピー操作が正常に完了し、アイテムがコピー先で使用できるようになります。 ただし、宣言されているため、項目を Drop Off ライブラリで削除することはできません。 この項目を削除しようとすると、前述のエラーが発生します。

アイテムのプロパティを編集すると、開催者ルールが再実行され、プロシージャが繰り返されます。 今回は、ドキュメントが既に宛先に存在するため、アイテム名のサフィックスには一意の ID が付けられます。

レコードの手動宣言を許可するように Drop Off ライブラリを変更した場合、そのような項目を除外解除した後に削除できます。 レコード ライブラリ内の項目が変更された場合、ライブラリはこの項目の宣言状態を変更しないため、アイテムを削除できません。

解決方法

手順 1: ドロップ オフ ライブラリの重複を修正する

アイテムをレコードとして自動的に宣言しないように、Drop Off ライブラリを更新します。 Drop Off ライブラリは、多くのコンテンツ オーガナイザー ルールの対象となる可能性がある 1 つの場所にドキュメントをドロップするために使用されます。

これにより、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 イベント レシーバーは配列の 2 番目の位置にあります。 したがって、配列が 0 で始まるので、位置番号は 1 です。

    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は です。 を指定し、receiverTypeAssemblyclassNameこのメソッドを使用すると、イベント レシーバーを作成できます。