我们在Windows Server 2008 R2 Enterprise x64计算机上安装了Sonar 3.6.2,并使用嵌入式H2数据库成功启动它作为Windows服务。尝试将数据库切换到Microsoft SQL Server 2008实例时,我们的问题已经开始。
我们正在使用提供的jtds数据库驱动程序(v1.2.7),并在sonar.properties文件中取消注释以下设置:
#----- Microsoft SQLServer
sonar.jdbc.username: <user>
sonar.jdbc.password: ***********
sonar.jdbc.url: jdbc:jtds:sqlserver://<host>:<port>/sonar;domain=<domain>;useNTLMv2=true
sonar.jdbc.driverClassName: net.sourceforge.jtds.jdbc.Driver
#----- Connection pool settings
sonar.jdbc.maxActive: 20
sonar.jdbc.maxIdle: 5
sonar.jdbc.minIdle: 2
sonar.jdbc.maxWait: 5000
sonar.jdbc.minEvictableIdleTimeMillis: 600000
sonar.jdbc.timeBetweenEvictionRunsMillis: 30000
# Delay (in seconds) between processing of notification queue
sonar.notifications.delay=60
当最初启动声纳时,我们可以看到它正在创建所有必要的表。但是,当它进入初始化Hibernate的阶段时,我们会看到以下错误:
2013.09.03 14:24:58 INFO o.s.j.s.AbstractDatabaseConnector Initializing Hibernate
2013.09.03 14:25:00 ERROR o.s.s.p.Platform Missing column: id in sonar.GLOBALTEST\AUSonardsa.active_rule_changes
org.hibernate.HibernateException: Missing column: id in sonar.GLOBALTEST\AUSonardsa.active_rule_changes
通过DBVisualizer与同一个AUSonardsa用户连接到同一个数据库,我可以看到表'active_rule_changes'就在那里,我可以做一个简单的sql语句'select id from active_rule_changes',返回一个空的表与单个id列。
谷歌搜索类似的问题(即在Hibernate初始化期间缺少表中的列)都表明需要设置'sonar.jdbc.schema'值。但是,当我们设置此值(例如,'dbo')时,错误会稍有变化:
2013-09-03 16:14:33.436:WARN:oejw.WebAppContext:Failed startup of context o.e.j.w.WebAppContext{/,file:/D:/devtools/Sonar/install/sonar-3.6.2/war/sonar-server/},file:/D:/devtools/Sonar/install/sonar-3.6.2/war/sonar-server
org.hibernate.HibernateException: Missing table: active_rule_changes
即使我们让dba手动将表移动到dbo模式,声纳仍然无法看到active_rule_changes表,无论我们是否设置了sonar.jdbc.schema属性。
我们甚至尝试删除整个声纳数据库,重新创建一个新的数据库,并将schema属性设置为'dbo'并再次启动声纳。在这种情况下,它继续并重新创建所有表,进入Hibernate初始化并再次抱怨没有找到active_rule_changes表。在这种情况下,即使schema属性设置为'dbo',表似乎仍然在AUSonardsa用户的架构下创建。
有人可以帮我们解决导致这些问题的原因吗?
答案 0 :(得分:0)
注释掉这个属性,它应该可以工作
#sonar.jdbc.schema: sonar
答案 1 :(得分:0)
您需要在数据库中将声纳用户的默认架构设置为dbo。
在数据库中运行如下所示的查询:
USE yourDatabase;
ALTER USER yourUser WITH DEFAULT_SCHEMA = dbo;
然后删除数据库中的所有表并重新启动服务器上的Sonar服务。这应该重新创建所有表dbo.<table name>
。
我意识到你的问题已经发生很久了。我们最近遇到了同样的问题并以这种方式解决了问题。希望这将有助于其他人在将来解决这个问题。