次の方法で共有


Configuration Manager で DP を再割り当てした後、DistributionContentVersion テーブル内の重複する行

この記事では、Configuration Manager で配布ポイント (DP) を別のプライマリ サイトに再割り当てした後、 DistributionContentVersion テーブルに重複する行が作成される問題の解決策と回避策について説明します。

元の製品バージョン: Configuration Manager (現在のブランチ - バージョン 1810)、Configuration Manager (Current Branch - バージョン 1806)、Configuration Manager (Current Branch - バージョン 1802)
元の KB 番号: 4498264

現象

Configuration Manager Current Branch バージョン 1802 以降のバージョン階層では、 Reassign 配布ポイント 機能を使用して、DP を別のプライマリ サイトに再割り当てします。 DP でコンテンツの検証が有効になっています。

このシナリオでは、新しいコンテンツ検証サイクルが終了すると、DP の各パッケージの重複する行が、古いサイト用と新しいサイト用の DistributionContentVersion テーブルに生成されます。

これは、サイト PS2 からサイト PS1 に DP を再割り当てするときに発生する処理の例です。

図 1: DP を再割り当てする前の DistributionContentVersion テーブルの出力

DP 移動前の DistributionContentVersion テーブルの出力のスクリーンショット。

図 2: DP を再割り当てし、新しいコンテンツ検証サイクルが終了した後の DistributionContentVersion テーブルの出力

DP 移動後の DistributionContentVersion テーブルの出力のスクリーンショット。

DP を再割り当てした後、 ContentDistribution テーブルへのデータのマージは失敗します。 たとえば、 spRebuildContentDistribution プロシージャを実行するか、構成データ グループを再初期化すると、次のエラー メッセージが表示されます。

メッセージ 8672、レベル 16、状態 1、プロシージャ spRebuildContentDistribution、行 197 [バッチ開始行 29]
MERGE ステートメントで、同じ行に対して UPDATE または DELETE が複数回試行されました。 これは、対象の行が基になる複数の行と一致する場合に発生します。 MERGE ステートメントでは対象のテーブルの同じ行で複数回 UPDATE/DELETE を実行することはできません。 対象の行と一致する基になる行が 1 つだけになるように ON 句を修正するか、GROUP BY 句を使用して基になる行をグループ化してください。

障害シナリオには、新しいサイトの追加、サイトの回復、構成データの再初期化などがあります。

原因

コンテンツ検証が有効になっている場合、 DistributionContentVersion テーブルには、コンテンツ検証によって報告されるデータが設定されます。 あるサイトから別のサイトに DP を再割り当てすると、DistributionContentVersion テーブルのDPNALPathspMoveDistributionPointプロシージャが更新されます。 ただし、 SiteCodeは更新されません。

そのため、DP が新しいサイトに再割り当てされ、新しいコンテンツ検証サイクルが実行された後、 DistributionContentVersion テーブル内のパッケージごとに 2 つの行があります。1 つは古いサイト用、1 つは新しいサイト用です。

この問題が発生したかどうかを確認するには、次の SQL クエリを実行します。

SELECT * FROM DistributionContentVersion DCV
LEFT JOIN DistributionPoints DP ON DP.NALPath = DCV.DPNALPath
WHERE DCV.SiteCode <> DP.SMSSiteCode

結果が NULL でない場合は、問題が発生します。

解決方法

この問題を解決するには、 Configuration Manager バージョン 1902 に更新します。

回避策

更新せずにこの問題を回避するには、DP を再割り当てした後、中央管理サイトまたはプライマリ サイトで次の SQL ステートメントを実行します。

--Detect and fix the DistributionContentVersion duplicates after reassigning a DP to a new site
--Run this on any one site in the hierarchy (CAS or Primary) and the fix should propagate in the rest sites through DRS

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #TEMP

SELECT DCV.PkgID, DCV.DPNALPath,DP.SMSSiteCode,DCV.SiteCode
INTO #TEMP
FROM DistributionContentVersion DCV
LEFT JOIN DistributionPoints DP ON DP.NALPath = DCV.DPNALPath
WHERE DCV.SiteCode <> DP.SMSSiteCode

IF EXISTS (SELECT 1 from #TEMP)
BEGIN
    PRINT 'Affected by DistributedContentVersion Duplicate PkgID, NalPath issue. Cleaning the old site records...'
    PRINT ''
    DECLARE @PkgID NVARCHAR(255)
    DECLARE @NALPath NVARCHAR(255)
    DECLARE @ActualSiteCode NVARCHAR(3)
    DECLARE @OldSiteCode NVARCHAR(3)

    DECLARE DelOldSiteInfoForDistContentVersion CURSOR FOR
        SELECT A.PkgID,A.DPNALPath,A.SMSSiteCode,A.SiteCode FROM #TEMP AS A
    OPEN DelOldSiteInfoForDistContentVersion;
    FETCH NEXT FROM DelOldSiteInfoForDistContentVersion INTO @PkgID,@NALPath,@ActualSiteCode,@OldSiteCode;
    WHILE @@FETCH_STATUS = 0
       BEGIN
          PRINT 'Deleting the record for Package '+ @PkgID +' and NalPath '+ @NalPath + ' for the Old SiteCode '+   @OldSiteCode
           -- Delete records of DP which are for the old site
          DELETE FROM DistributionContentVersion WHERE PkgID=@PkgID AND DPNALPath=@NALPath AND SiteCode = @OldSiteCode
       FETCH NEXT FROM DelOldSiteInfoForDistContentVersion INTO @PkgID,@NALPath,@ActualSiteCode,@OldSiteCode;
       END;
    CLOSE DelOldSiteInfoForDistContentVersion;
    DEALLOCATE DelOldSiteInfoForDistContentVersion;
END
ELSE
    PRINT 'DistributionContentVersion table is Fine. Exiting...'