2016-08-05 5 views
5

最近、SonarQube 5.6.1 LTSから6.0にアップグレードしようとしました。SonarQube 5.6.1 LTSから6.0へのデータベース移行を実行できません

私はアップグレードガイドを使用しましたが、データベースの移行エラーが発生しました。 org.sonar.db.version.v60.CleanUsurperRootComponents ます。com.microsoft.sqlserver.jdbc.SQLServerException:データベースの移行を実行するための

失敗は同じで、「SQL_Latin1_General_CP1_CS_AS」と「Latin1_General_CS_AS」との照合の競合を解決できません操作に。

私はSQL_Latin1_General_CP1_CS_ASでSQL 2014を使用しています。

私は、セットアップのために、次のガイドを使用:ソナーデータベース内に誤った照合「Latin1_General_CS_AS」と157列があります

SonarQube Setup Gruide for .Net Users v.1.3

を。

よろしく

ダニエル

+3

このスレッドに興味があります:https://groups.google.com/forum/#!searchin/sonarqube/collat​​ion%7Csort:relevance/sonarqube/2HYcA97CdY0/JtFRC2YMBgAJ –

+0

ここに同じ問題があります。これを見てください(http://stackoverflow.com/questions/9698618/sql-latin1-general-cp1-cs-as-vs-latin1-general-cs-as)ので、質問: "唯一の本当の違いは、いくつかの文字の並べ替え順序 " –

答えて

7

オプション1:新しい空のデータベースを起動します。

オプション2:SonarQubeデータベースを復元し、再度アップグレードを開始する前に(データベースがSonarQubeと呼ばれていると仮定して)SQL Management Studioを使用して、データベースの照合順序を変更します。

-- Show current collation 
USE [master] 
GO 

SELECT [collation_name] 
FROM [sys].[databases] 
WHERE name = 'SonarQube' 
GO 

結果がLatin1_General_CS_ASでなければなりません。クエリがSQL_Latin1_General_CP1_CS_ASを返した場合は6.0にアップグレードする前に、データベースの照合順序を変更

USE [master] 
GO 

ALTER DATABASE [SonarQube] SET SINGLE_USER WITH ROLLBACK IMMEDIATE  
ALTER DATABASE [SonarQube] COLLATE Latin1_General_CS_AS; 
ALTER DATABASE [SonarQube] SET MULTI_USER 
GO 

オプション3:(最後の)データベースの照合順序を変更します(オプション2を参照)、(SQL Management Studioを使用して)手動でデータベースを変更。最初に次のクエリを実行します。

USE [SonarQube] 
GO 

SELECT '[' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.[name] + '] -> ' + c.[name] 
,  'ALTER TABLE [' + SCHEMA_NAME(t.[schema_id]) + '].[' + t.[name] + '] 
      ALTER COLUMN [' + c.[name] + '] ' + UPPER(tt.name) + 
     CASE WHEN t.name NOT IN ('ntext', 'text') 
      THEN '(' + 
       CASE 
        WHEN tt.name IN ('nchar', 'nvarchar') AND c.max_length != -1 
         THEN CAST(c.max_length/2 AS VARCHAR(10)) 
        WHEN tt.name IN ('char', 'varchar') AND c.max_length != -1 
         THEN CAST(c.max_length AS VARCHAR(10)) 
        WHEN tt.name IN ('nchar', 'nvarchar', 'char', 'varchar') AND c.max_length = -1 
         THEN 'MAX' 
        ELSE CAST(c.max_length AS VARCHAR(10)) 
       END + ')' 
      ELSE '' 
     END + ' COLLATE Latin1_General_CS_AS' + 
     CASE WHEN c.[is_nullable] = 1 
      THEN ' NULL' 
      ELSE ' NOT NULL' 
     END 
FROM [sys].[columns] c 
JOIN [sys].[tables] t ON c.[object_id] = t.[object_id] 
JOIN [sys].[types] tt ON c.[system_type_id] = tt.[system_type_id] AND c.[user_type_id] = tt.[user_type_id] 
WHERE c.[collation_name] IS NOT NULL 
AND c.[collation_name] != 'Latin1_General_CS_AS' 
AND t.[type] = 'U' 
GO 

これはいくつかの行を返します。

一部の列は、最初に削除する必要がある索引で使用されるため、この方法では変更できません。例:

-- Pay attention: generate script first! 
DROP INDEX [resource_index_component] ON [dbo].[resource_index] 
GO 

ALTER TABLE [dbo].[resource_index] 
ALTER COLUMN [component_uuid] NVARCHAR(50) COLLATE Latin1_General_CS_AS NOT NULL 
GO 

-- Generate the create script in SQL Management Studio... 
CREATE NONCLUSTERED INDEX [resource_index_component] 
    ON [dbo].[resource_index] ([component_uuid] ASC) 
    WITH (...) ON ... 
GO 

SonarQubeを再起動して、アップグレードを再開してください。

+1

なぜああ! SonarQubeが照合要件を変更したのはなぜですか?!?!?!私はv6にアップグレードするためにオプション3を通過する必要があり、それは悪夢になるだろう! –

+0

私はオプション2を使用しましたが、それは魅力的なように機能しているようです。これは本当にありがとう。 – markdemich

+0

私はオプション2を使用しましたが、それは魅力的なように機能しているようです。これは本当にありがとう。更新:私は銃を飛び越えたかもしれない。 DBを更新した後、私は何らかの腐敗があるようです。私の品質プロフィールには活性化されたルールはありませんでしたが、ルールを見るとDeactivateボタンが表示されていました。それは非常に奇妙です。 – markdemich

関連する問題