5

最近、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 を使用しています。

セットアップには次のガイドを使用しました。

.Net ユーザー向けの SonarQube セットアップ ガイド v.1.3

Sonar データベースには、間違った照合順序 "Latin1_General_CS_AS" を持つ 157 列があります。

よろしく

ダニエル

4

1 に答える 1

7

オプション 1: 新しい空のデータベースから始めます。

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

 -- 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

これにより、複数の行が返されます。例えば:

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

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

-- 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 を再起動し、アップグレードを再度開始します。

于 2016-08-05T19:19:40.520 に答える