还原 Microsoft Dynamics CRM 数据库时出现“无法在此版本的 SQL Server 中启动数据库”错误

本文提供了无法将具有 Microsoft SQL Server Enterprise Edition 数据库的 Microsoft Dynamics CRM 2011 还原到Microsoft SQL Server Standard 版本的服务器的问题的解决方法。

适用于: Microsoft Dynamics CRM 2011
原始 KB 数: 2567984

现象

尝试将 Microsoft SQL Server Enterprise 数据库还原到运行 Microsoft SQL Server Standard 的另一台服务器时,会出现以下错误:

服务器“SQLServerName”还原失败。

其他信息:
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
无法在此版本的 SQL Server 中启动数据库“Org_MSCRM”,因为它包含分区函数“AuditPFN”。 只有 SQL Server Enterprise Edition 支持分区。 无法启动数据库“Org_MSCRM”,因为某些数据库功能在当前版本的 SQL Server 中不可用。 (Microsoft SQL Server,错误:905)

原因

使用 Microsoft SQL Server Enterprise 版本安装 Microsoft Dynamics CRM 2011 时,将为 Microsoft Dynamics CRM 2011 的审核功能创建分区。 AuditBase 表使用分区,该分区仅适用于Microsoft SQL Server Enterprise。

解决方法

使用以下步骤和脚本删除分区。 以下脚本重新创建主分区上的所有索引,然后删除分区。

在执行以下步骤之前,请务必备份该 'Org_MSCRM' 数据库。

  1. 'Org_MSCRM' 数据库还原到 Microsoft SQL Server Enterprise Edition。 建议备份和还原数据库,而不是在生产数据库上运行脚本。

  2. 针对还原的数据库运行以下脚本。

    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. 脚本完成后,可以备份数据库,现在应该能够将数据库还原到Microsoft SQL Server Standard 版本。

详细信息

审核功能在 sql Server Standard 版本Microsoft仍然有效,但是,使用标准版时,删除审核历史记录的整个分区的功能不可用。