この記事では、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
テーブルの出力
図 2: DP を再割り当てし、新しいコンテンツ検証サイクルが終了した後の DistributionContentVersion
テーブルの出力
DP を再割り当てした後、 ContentDistribution
テーブルへのデータのマージは失敗します。 たとえば、 spRebuildContentDistribution
プロシージャを実行するか、構成データ グループを再初期化すると、次のエラー メッセージが表示されます。
メッセージ 8672、レベル 16、状態 1、プロシージャ spRebuildContentDistribution、行 197 [バッチ開始行 29]
MERGE ステートメントで、同じ行に対して UPDATE または DELETE が複数回試行されました。 これは、対象の行が基になる複数の行と一致する場合に発生します。 MERGE ステートメントでは対象のテーブルの同じ行で複数回 UPDATE/DELETE を実行することはできません。 対象の行と一致する基になる行が 1 つだけになるように ON 句を修正するか、GROUP BY 句を使用して基になる行をグループ化してください。
障害シナリオには、新しいサイトの追加、サイトの回復、構成データの再初期化などがあります。
原因
コンテンツ検証が有効になっている場合、 DistributionContentVersion
テーブルには、コンテンツ検証によって報告されるデータが設定されます。 あるサイトから別のサイトに DP を再割り当てすると、DistributionContentVersion
テーブルのDPNALPath
spMoveDistributionPoint
プロシージャが更新されます。 ただし、 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...'