Error "No se puede iniciar la base de datos en esta edición de SQL Server" al restaurar una base de datos de Microsoft Dynamics CRM

En este artículo se proporciona una solución para el problema de que no se puede restaurar una Microsoft Dynamics CRM 2011 con la base de datos de edición de Microsoft SQL Server Enterprise a un servidor con Microsoft SQL Server Standard edición.

Se aplica a: Microsoft Dynamics CRM 2011
Número de KB original: 2567984

Síntomas

Al intentar restaurar una base de datos de Microsoft SQL Server Enterprise a otro servidor que ejecuta Microsoft SQL Server Standard, se produce el siguiente error:

Error en la restauración del servidor "SQLServerName".

Información adicional:
Se produjo una excepción al ejecutar una instrucción o lote de Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
La base de datos "Org_MSCRM" no se puede iniciar en esta edición de SQL Server porque contiene una función de partición "AuditPFN". Solo la edición Enterprise de SQL Server admite la creación de particiones. No se puede iniciar la base de datos "Org_MSCRM" porque parte de la funcionalidad de la base de datos no está disponible en la edición actual de SQL Server. (Microsoft SQL Server, Error: 905)

Causa

Cuando Microsoft Dynamics CRM 2011 se instala mediante una edición de Microsoft SQL Server Enterprise, se crea una partición para la funcionalidad de auditoría de Microsoft Dynamics CRM 2011. La tabla AuditBase usa particiones que solo están disponibles para Microsoft SQL Server Enterprise.

Resolución

Use los siguientes pasos y script para quitar la creación de particiones. El siguiente script vuelve a crear todos los índices de la partición principal y, a continuación, quita la partición.

Asegúrese de tener una copia de seguridad de base de datos de antes de 'Org_MSCRM' realizar los pasos siguientes.

  1. Restaure la 'Org_MSCRM' base de datos en una edición de Microsoft SQL Server Enterprise. Se recomienda realizar una copia de seguridad y restaurar la base de datos en lugar de ejecutar el script en la base de datos de producción.

  2. Ejecute el siguiente script en la base de datos restaurada.

    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. Una vez completado el script, puede realizar una copia de seguridad de la base de datos y ahora debería poder restaurar la base de datos a una edición Microsoft SQL Server Standard.

Más información

La característica de auditoría sigue funcionando en Microsoft SQL Server Standard edición, pero cuando se usa la edición Standard, la capacidad de eliminar una partición completa del historial de auditoría no está disponible.