Compartilhar via


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.