Поделиться через


Ошибка "База данных не может быть запущена в этом выпуске SQL Server" при восстановлении базы данных Microsoft Dynamics CRM

Эта статья предлагает решение проблемы, связанной с невозможностью восстановления Microsoft Dynamics CRM 2011 с базой данных версии Microsoft SQL Server Enterprise Edition на сервер с версией Microsoft SQL Server Standard Edition.

Область применения: Microsoft Dynamics CRM 2011
Исходный номер базы знаний: 2567984

Симптомы

При попытке восстановить базу данных Microsoft SQL Server Enterprise на другой сервер под управлением Microsoft SQL Server Standard вы получите следующую ошибку:

Сбой восстановления для сервера "SQLServerName".

Дополнительные сведения:
Возникло исключение при выполнении пакета или инструкции Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
База данных "Org_MSCRM" не может быть запущена в этом выпуске SQL Server, так как она содержит функцию секционирования AuditPFN. Секционирование поддерживается только в выпуске SQL Server Enterprise Edition. Невозможно запустить базу данных "Org_MSCRM", так как некоторые функции базы данных недоступны в текущем выпуске SQL Server. (Microsoft SQL Server, ошибка: 905)

Причина

При установке Microsoft Dynamics CRM 2011 с использованием издания Microsoft SQL Server Enterprise создается раздел для функциональности аудита 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 возможность удаления всей секции журнала аудита недоступна.