Condividi tramite


Errore "Impossibile avviare il database in questa edizione di SQL Server" durante il ripristino di un database di Microsoft Dynamics CRM

Questo articolo fornisce una risoluzione per il problema che non è possibile ripristinare un database Microsoft Dynamics CRM 2011 con Microsoft SQL Server Enterprise Edition in un server con Microsoft SQL Server Standard Edition.

Si applica a: Microsoft Dynamics CRM 2011
Numero KB originale: 2567984

Sintomi

Quando si tenta di ripristinare un database Microsoft SQL Server Enterprise in un altro server che esegue Microsoft SQL Server Standard, viene visualizzato l'errore seguente:

Ripristino non riuscito per il server 'SQLServerName'.

Informazioni aggiuntive:
Si è verificata un'eccezione durante l'esecuzione di una dichiarazione o batch Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
Impossibile avviare il database 'Org_MSCRM' in questa edizione di SQL Server perché contiene una funzione di partizione 'AuditPFN'. Il partizionamento è supportato solo in SQL Server Enterprise Edition. Impossibile avviare il database 'Org_MSCRM' perché alcune funzionalità del database non sono disponibili nell'edizione corrente di SQL Server. (Microsoft SQL Server, Errore: 905)

Causa

Quando Microsoft Dynamics CRM 2011 viene installato usando un'edizione Microsoft SQL Server Enterprise, viene creata una partizione per la funzionalità di controllo di Microsoft Dynamics CRM 2011. La tabella AuditBase usa il partizionamento disponibile solo per Microsoft SQL Server Enterprise.

Risoluzione

Usare i passaggi e gli script seguenti per rimuovere il partizionamento. Lo script seguente ricrea tutti gli indici nella partizione Primaria e quindi elimina la partizione.

Assicurarsi di disporre di un backup del database di 'Org_MSCRM' prima di eseguire i passaggi seguenti.

  1. Ripristinare il 'Org_MSCRM' database su un'edizione Microsoft SQL Server Enterprise. È consigliabile eseguire il backup e il ripristino del database anziché eseguire lo script nel database di produzione.

  2. Eseguire lo script seguente sul database ripristinato.

    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. Al termine dello script, è possibile eseguire il backup del database e ora dovrebbe essere possibile ripristinare il database in un'edizione Microsoft SQL Server Standard.

Ulteriori informazioni

La funzionalità di controllo è ancora funzionante in Microsoft SQL Server Standard Edition, tuttavia quando si usa l'edizione Standard la possibilità di eliminare un'intera partizione della cronologia di controllo non è disponibile.