Udostępnij za pomocą


Błąd "Nie można uruchomić bazy danych w tej wersji programu SQL Server" podczas przywracania bazy danych programu Microsoft Dynamics CRM

Ten artykuł zawiera rozwiązanie problemu, którego nie można przywrócić bazy programu Microsoft Dynamics CRM 2011 z wersji Microsoft SQL Server Enterprise edition na serwer z wersją Microsoft SQL Server Standard edition.

Dotyczy: Microsoft Dynamics CRM 2011
Oryginalny numer KB: 2567984

Objawy

Podczas próby przywrócenia bazy danych programu Microsoft SQL Server Enterprise na inny serwer z uruchomionym programem Microsoft SQL Server Standard występuje następujący błąd:

Przywracanie nie powiodło się dla serwera "SQLServerName".

Dodatkowe informacje:
Wystąpił wyjątek podczas wykonywania instrukcji lub pakietu Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
Nie można uruchomić bazy danych "Org_MSCRM" w tej wersji programu SQL Server, ponieważ zawiera funkcję partycji "AuditPFN". Tylko wersja Enterprise programu SQL Server obsługuje partycjonowanie. Nie można uruchomić bazy danych "Org_MSCRM", ponieważ niektóre funkcje bazy danych nie są dostępne w bieżącej wersji programu SQL Server. (Microsoft SQL Server, błąd: 905)

Przyczyna

Gdy program Microsoft Dynamics CRM 2011 jest instalowany przy użyciu wersji Microsoft SQL Server Enterprise, zostanie utworzona partycja na potrzeby funkcji inspekcji programu Microsoft Dynamics CRM 2011. Tabela AuditBase używa partycjonowania, które jest dostępne tylko dla programu Microsoft SQL Server Enterprise.

Rozwiązanie

Aby usunąć partycjonowanie, wykonaj następujące kroki i skrypt. Poniższy skrypt ponownie utworzy wszystkie indeksy w partycji podstawowej, a następnie pominie partycję.

Przed wykonaniem poniższych kroków pamiętaj, aby utworzyć kopię zapasową 'Org_MSCRM' bazy danych.

  1. 'Org_MSCRM' Przywróć bazę danych do wersji Microsoft SQL Server Enterprise. Zaleca się tworzenie kopii zapasowych i przywracanie bazy danych zamiast uruchamiania skryptu w produkcyjnej bazie danych.

  2. Uruchom następujący skrypt względem przywróconej bazy danych.

    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. Po zakończeniu wykonywania skryptu możesz utworzyć kopię zapasową bazy danych, a teraz powinno być możliwe przywrócenie bazy danych do wersji Microsoft SQL Server Standard.

Więcej informacji

Funkcja inspekcji jest nadal funkcjonalna w wersji Microsoft SQL Server Standard, jednak w przypadku korzystania z wersji Standard możliwość usunięcia całej partycji historii inspekcji jest niedostępna.