gpt4 book ai didi

sql-server - 无法执行从 SonarQube 5.6.1 LTS 到 6.0 的数据库迁移

转载 作者:行者123 更新时间:2023-12-02 23:15:00 25 4
gpt4 key购买 nike

我最近尝试从 SonarQube 5.6.1 LTS 升级到 6.0。

我使用了升级指南,但遇到了数据库迁移错误。

Fail to execute database migration: org.sonar.db.version.v60.CleanUsurperRootComponents com.microsoft.sqlserver.jdbc.SQLServerException: Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CS_AS" and "Latin1_General_CS_AS" in the equal to operation.

我使用 SQL 2014 和 SQL_Latin1_General_CP1_CS_AS。

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

SonarQube Setup Gruide for .Net Users v.1.3

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

问候

丹尼尔

最佳答案

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

关于sql-server - 无法执行从 SonarQube 5.6.1 LTS 到 6.0 的数据库迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38783763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com