【问题标题】:Fail to execute database migration from SonarQube 5.6.1 LTS to 6.0无法执行从 SonarQube 5.6.1 LTS 到 6.0 的数据库迁移
【发布时间】:2016-12-11 13:06:39
【问题描述】:

我最近尝试从 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。

我使用以下指南进行设置:

SonarQube Setup Gruide for .Net Users v.1.3

Sonar 数据库中有 157 列使用错误的排序规则“Latin1_General_CS_AS”。

问候

丹尼尔

【问题讨论】:

标签: sql-server sonarqube sonarqube-ops


【解决方案1】:

选项 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 并再次开始升级。

【讨论】:

  • 为什么哦为什么!!!为什么 SonarQube 更改了排序规则!?!?!?!我必须通过选项 3 升级到 v6,这将是一场噩梦!
  • 我使用了选项 2,它似乎很有魅力。非常感谢。
  • 我使用了选项 2,它似乎很有魅力。非常感谢。更新:我可能已经过火了。更新数据库后,似乎我可能有某种损坏。我的质量配置文件没有激活的规则,但是当我查看规则时,有些规则有停用按钮,这意味着它们已被激活。这很奇怪。
  • @TylerSmith,你得到这份工作了吗?我真的不想做选项 3。
  • 我最终只升级了最新的 5.x。完成后,我没有任何激活的规则。我需要删除 data/es 文件夹并重新启动。这似乎让它起作用了。
猜你喜欢
  • 2017-12-03
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2019-06-09
相关资源
最近更新 更多