Felet "Det går inte att starta databasen i den här versionen av SQL Server" när du återställer en Microsoft Dynamics CRM-databas

Den här artikeln innehåller en lösning på problemet att du inte kan återställa en Microsoft Dynamics CRM 2011 med Microsoft SQL Server Enterprise Edition-databas till en server med Microsoft SQL Server Standard Edition.

Gäller för: Microsoft Dynamics CRM 2011
Ursprungligt KB-nummer: 2567984

Symptomer

När du försöker återställa en Microsoft SQL Server Enterprise-databas till en annan server som kör Microsoft SQL Server Standard får du följande fel:

Återställningen misslyckades för servern "SQLServerName".

Ytterligare information:
Ett undantag uppstod när en Transact-SQL-instruktion eller batch skulle köras. (Microsoft.SqlServer.ConnectionInfo)
Databasen "Org_MSCRM" kan inte startas i den här versionen av SQL Server eftersom den innehåller partitionsfunktionen "AuditPFN". Endast Enterprise-utgåvan av SQL Server stöder partitionering. Det går inte att starta databasen "Org_MSCRM" eftersom en del av databasfunktionerna inte är tillgängliga i den aktuella versionen av SQL Server. (Microsoft SQL Server, Fel: 905)

Orsak

När Microsoft Dynamics CRM 2011 installeras med en Microsoft SQL Server Enterprise-utgåva skapas en partition för granskningsfunktionerna i Microsoft Dynamics CRM 2011. Tabellen AuditBase använder partitionering som endast är tillgänglig för Microsoft SQL Server Enterprise.

Åtgärd

Använd följande steg och skript för att ta bort partitioneringen. Följande skript återskapar alla index på den primära partitionen och släpper sedan partitionen.

Se till att ha en databassäkerhetskopia av 'Org_MSCRM' innan du utför följande steg.

  1. Återställ databasen 'Org_MSCRM' till en Microsoft SQL Server Enterprise-utgåva. Vi rekommenderar att du säkerhetskopierar och återställer databasen i stället för att köra skriptet på produktionsdatabasen.

  2. Kör följande skript mot den återställda databasen.

    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. När skriptet är klart kan du säkerhetskopiera databasen och nu bör du kunna återställa databasen till en Microsoft SQL Server Standard-utgåva.

Mer information

Granskningsfunktionen fungerar fortfarande i Microsoft SQL Server Standard Edition, men när du använder Standard-utgåvan är det inte tillgängligt att ta bort en hel partition av granskningshistoriken.