Erro "O banco de dados não pode ser iniciado nesta edição do SQL Server" ao restaurar um banco de dados do Microsoft Dynamics CRM

Este artigo fornece uma resolução para o problema de que você não pode restaurar um banco de dados do Microsoft Dynamics CRM 2011 com o Microsoft SQL Server Enterprise Edition para um servidor com o Microsoft SQL Server Standard Edition.

Aplica-se a: Microsoft Dynamics CRM 2011
Número original do KB: 2567984

Sintomas

Ao tentar restaurar um banco de dados do Microsoft SQL Server Enterprise para outro servidor que executa o Microsoft SQL Server Standard, você recebe o seguinte erro:

Falha na restauração do servidor 'SQLServerName'.

Informações adicionais:
Ocorreu uma exceção ao executar uma instrução ou um lote Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
O banco de dados 'Org_MSCRM' não pode ser iniciado nesta edição do SQL Server porque contém uma função de partição 'AuditPFN'. Somente a edição Enterprise do SQL Server oferece suporte ao particionamento. O banco de dados 'Org_MSCRM' não pode ser iniciado porque algumas das funcionalidades do banco de dados não estão disponíveis na edição atual do SQL Server. (Microsoft SQL Server, Erro: 905)

Motivo

Quando o Microsoft Dynamics CRM 2011 é instalado usando uma edição do Microsoft SQL Server Enterprise, uma partição é criada para a funcionalidade de auditoria do Microsoft Dynamics CRM 2011. A tabela AuditBase usa particionamento que só está disponível para o Microsoft SQL Server Enterprise.

Resolução

Use as etapas e o script a seguir para remover o particionamento. O script a seguir recria todos os índices na partição primária e, em seguida, descarta a partição.

Certifique-se de ter um backup do banco de dados 'Org_MSCRM' antes de executar as etapas a seguir.

  1. Restaure o 'Org_MSCRM' banco de dados para uma edição do Microsoft SQL Server Enterprise. É recomendável fazer backup e restaurar o banco de dados em vez de executar o script no banco de dados de produção.

  2. Execute o script a seguir no banco de dados restaurado.

    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. Depois que o script for concluído, você poderá fazer backup do banco de dados e agora poderá restaurar o banco de dados para uma edição do Microsoft SQL Server Standard.

Mais informações

O recurso de auditoria ainda está funcional no Microsoft SQL Server Standard Edition, no entanto, ao usar a edição Standard, a capacidade de excluir uma partição inteira do histórico de auditoria não está disponível.