次の方法で共有


Microsoft Dynamics CRM データベースの復元時に "このエディションの SQL Server でデータベースを起動できません" というエラーが表示される

この記事では、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' のデータベース バックアップを作成してください。

  1. 'Org_MSCRM' データベースを Microsoft SQL Server Enterprise エディションに復元します。 運用データベースでスクリプトを実行する代わりに、データベースのバックアップと復元を行うことをお勧めします。

  2. 復元されたデータベースに対して次のスクリプトを実行します。

    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 
    ```
    
    
  3. スクリプトが完了したら、データベースをバックアップできます。これで、データベースを Microsoft SQL Server Standard エディションに復元できるようになります。

詳細

監査機能は Microsoft SQL Server Standard エディションで引き続き機能しますが、Standard エディションを使用する場合、監査履歴のパーティション全体を削除することはできません。