共用方式為


還原 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)
資料庫 'Org_MSCRM' 無法在此版本的 SQL Server 中啟動,因為它包含數據分割函數 'AuditPFN'。 只有 Enterprise Edition 的 SQL Server 才支援分割區。 無法啟動資料庫 『Org_MSCRM』,因為目前版本的 SQL Server 中無法使用某些資料庫功能。 (Microsoft SQL Server,錯誤:905)

原因

使用 Microsoft SQL Server Enterprise 版本安裝 Microsoft Dynamics CRM 2011 時,會為其稽核功能建立分區。 AuditBase 數據表使用只有 Microsoft SQL Server Enterprise 才有的數據分割功能。

解決方法

使用下列步驟和腳本來移除數據分割。 下列腳本會重新建立主要分區上的所有索引,然後刪除分區。

執行下列步驟之前,請務必對'Org_MSCRM'進行資料庫備份。

  1. 'Org_MSCRM' 資料庫還原至 Microsoft SQL Server Enterprise 版本。 建議您備份和還原資料庫,而不是在生產資料庫上執行腳本。

  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 版本。

其他相關資訊

稽核功能仍可在 MICROSOFT SQL Server Standard 版本上運作,不過當使用 Standard 版本時,無法刪除稽核記錄的整個分割區。