この記事では、Microsoft DYNAMICS CRM 2011 と Microsoft SQL Server Enterprise Edition データベースを Microsoft SQL Server Standard エディションのサーバーに復元できない問題の解決策について説明します。
適用対象: Microsoft Dynamics CRM 2011
元の KB 番号: 2567984
症状
Microsoft SQL Server Standard を実行している別のサーバーに Microsoft SQL Server Enterprise データベースを復元しようとすると、次のエラーが発生します。
サーバー 'SQLServerName' の復元に失敗しました。
追加情報:
Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.ConnectionInfo)
データベース 'Org_MSCRM' にはパーティション関数 'AuditPFN' が含まれているため、このエディションの SQL Server では起動できません。 パーティション分割は SQL Server Enterprise Edition でしかサポートされません。 SQL Server の現在のエディションでは一部のデータベース機能を使用できないため、データベース 'Org_MSCRM' を起動できません。 (Microsoft SQL Server、エラー: 905)
原因
Microsoft SQL Server Enterprise エディションを使用して Microsoft Dynamics CRM 2011 をインストールすると、Microsoft Dynamics CRM 2011 の監査機能用のパーティションが作成されます。 AuditBase テーブルでは、Microsoft SQL Server Enterprise でのみ使用できるパーティション分割が使用されます。
解決方法
パーティション分割を削除するには、次の手順とスクリプトを使用します。 次のスクリプトは、プライマリ パーティションのすべてのインデックスを再作成し、パーティションを削除します。
次の手順を実行する前に、必ず 'Org_MSCRM'
のデータベース バックアップを作成してください。
'Org_MSCRM'
データベースを Microsoft SQL Server Enterprise エディションに復元します。 運用データベースでスクリプトを実行する代わりに、データベースのバックアップと復元を行うことをお勧めします。復元されたデータベースに対して次のスクリプトを実行します。
IF Object_id('tempdb..#indexesScript', 'U') IS NOT NULL DROP TABLE #indexesScript IF EXISTS (SELECT NAME FROM sys.partition_schemes WHERE NAME = 'AuditPScheme') BEGIN SELECT CASE WHEN ind.type != 1 THEN 'DROP INDEX [dbo].[AuditBase].' + Quotename(ind.NAME) + ' ' ELSE ' ' END + 'CREATE ' + CASE is_unique WHEN 1 THEN 'UNIQUE ' ELSE '' END + ind.type_desc + ' INDEX ' + Quotename(ind.NAME COLLATE sql_latin1_general_cp1_ci_as ) + ' ON [dbo].' + Quotename(Object_name(object_id)) + ' (' + Reverse(Substring(Reverse(( SELECT NAME + CASE WHEN sc.is_descending_key = 1 THEN ' DESC' ELSE ' ASC' END + ',' FROM sys.index_columns sc JOIN sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id WHERE Object_name( sc.object_id) = 'AuditBase' AND sc.object_id = ind.object_id AND sc.index_id = ind.index_id ORDER BY index_column_id ASC FOR xml path(''))), 2, 8000 )) + ')' + CASE WHEN ind.type = 1 THEN ' WITH (DROP_EXISTING = ON) ON [PRIMARY]' ELSE ' ' END AS Script INTO #indexesScript FROM sys.indexes ind JOIN sys.partition_schemes ps ON ind.data_space_id = ps.data_space_id WHERE Object_name(object_id) = 'AuditBase' AND ps.NAME = 'AuditPScheme' AND is_unique_constraint = 0 SELECT * FROM #indexesScript DECLARE @recreateScript NVARCHAR(max) DECLARE indscript CURSOR FOR SELECT script FROM #indexesScript OPEN indscript FETCH next FROM indscript INTO @recreateScript WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRANSACTION t1 EXECUTE Sp_executesql @recreateScript IF @@ERROR > 0 BEGIN ROLLBACK TRAN t1 DECLARE @message VARCHAR(max) SET @message = 'Audit history recreate index failed. SQL: ' + @recreateScript RAISERROR (@message,10,1) END ELSE BEGIN COMMIT TRAN END FETCH next FROM indscript INTO @recreateScript END DROP partition scheme auditpscheme DROP partition FUNCTION auditpfn CLOSE indscript DEALLOCATE indscript DROP TABLE #indexesScript END ```
スクリプトが完了したら、データベースをバックアップできます。これで、データベースを Microsoft SQL Server Standard エディションに復元できるようになります。
詳細
監査機能は Microsoft SQL Server Standard エディションで引き続き機能しますが、Standard エディションを使用する場合、監査履歴のパーティション全体を削除することはできません。