PrimaryKeyExists precondition fails on Oracle

Description

I have the following precondition:

<primaryKeyExists primaryKeyName="USERATTRS_PKEY" tableName="USERATTRIBUTES"/>

The database does contain the primary key. But when the precondition is checked a NullPointerException occurs:

May 5, 2015 4:46:55 PM CEST [pool-1-thread-18] [SEVERE] changelog-master.xml: changelog-8.0.0.0.xml::8.0.0.0-30::scriptura: Change Set changelog-8.0.0.0.xml::8.0.0.0-30::scriptura failed. Error: Migration failed for change set changelog-8.0.0.0.xml::8.0.0.0-30::scriptura: Reason: changelog-master.xml : liquibase.precondition.core.PrimaryKeyExistsPrecondition@3b0ca4c5 : null liquibase.exception.MigrationFailedException: Migration failed for change set changelog-8.0.0.0.xml::8.0.0.0-30::scriptura: Reason: changelog-master.xml : liquibase.precondition.core.PrimaryKeyExistsPrecondition@3b0ca4c5 : null at liquibase.changelog.ChangeSet.execute(ChangeSet.java:316) at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:40) at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:64) at liquibase.Liquibase.update(Liquibase.java:202) at id.security.auth.config.common.AbstractSecurityDatabaseListener.checkUpgradeDatabase(AbstractSecurityDatabaseListener.java:388) at com.id.security.auth.realm.oauth.db.HibernateDataAccess.onDatabaseConnectionReady(HibernateDataAccess.java:137) at id.security.auth.config.common.AbstractSecurityDatabaseListener.initializeSecurityDatabase(AbstractSecurityDatabaseListener.java:169) at id.security.auth.config.common.AbstractSecurityDatabaseListener.configurationChanged(AbstractSecurityDatabaseListener.java:305) at com.id.security.auth.realm.oauth.db.HibernateDataAccess.configurationChanged(HibernateDataAccess.java:619) at com.id.internal.configuration.impl.AbstractLeveledConfigurationService.notifyListeners(AbstractLeveledConfigurationService.java:352) at com.id.internal.configuration.impl.AbstractLeveledConfigurationService.endCompositeChange(AbstractLeveledConfigurationService.java:413) at com.id.internal.configuration.impl.AbstractLeveledConfigurationService.endCompositeChange(AbstractLeveledConfigurationService.java:401) at com.id.configuration.plugin.AbstractPluginConfiguration.endCompositeChange(AbstractPluginConfiguration.java:2232) at com.id.webapp.system.administration.firstrun.SetupService.initial(SetupService.java:530) at com.id.webapp.system.administration.firstrun.SetupService.setInitialConfiguration(SetupService.java:631) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:136) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:406) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106) at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:368) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1014) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: liquibase.exception.PreconditionErrorException: Precondition Error at liquibase.precondition.core.PrimaryKeyExistsPrecondition.check(PrimaryKeyExistsPrecondition.java:84) at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:33) at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:37) at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:199) at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:37) at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:199) at liquibase.changelog.ChangeSet.execute(ChangeSet.java:273) ... 83 more Caused by: java.lang.NullPointerException at liquibase.structure.core.PrimaryKey.toString(PrimaryKey.java:103) at java.lang.String.valueOf(String.java:2981) at java.lang.StringBuilder.append(StringBuilder.java:131) at java.util.AbstractCollection.toString(AbstractCollection.java:462) at liquibase.structure.DatabaseObjectCollection$1.compare(DatabaseObjectCollection.java:100) at liquibase.structure.DatabaseObjectCollection$1.compare(DatabaseObjectCollection.java:95) at java.util.TreeMap.compare(TreeMap.java:1291) at java.util.TreeMap.put(TreeMap.java:538) at java.util.TreeSet.add(TreeSet.java:255) at liquibase.structure.DatabaseObjectCollection.get(DatabaseObjectCollection.java:109) at liquibase.snapshot.DatabaseSnapshot.get(DatabaseSnapshot.java:230) at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:138) at liquibase.snapshot.SnapshotGeneratorFactory.has(SnapshotGeneratorFactory.java:91) at liquibase.precondition.core.PrimaryKeyExistsPrecondition.check(PrimaryKeyExistsPrecondition.java:74) ... 89 more

I have looked into it a bit, and noticed that the primary key gets found, stored in a cache, but when it is taken from that cache to be used a moment later it has lost an attribute. Because the 'table' attribute has vanished (or null) the exception gets thrown.

Environment

Oracle 11g

Activity

Show:

Adrien SALES May 18, 2015 at 1:52 AM

"We decided that people who use the 'System' schema on Oracle are just bad users " -> Oh, yes, for sure, they are !

Chris Vesters May 14, 2015 at 11:14 AM

I could try but I don't know if it's worth the effort.
We decided that people who use the 'System' schema on Oracle are just bad users and shouldn't do that.
They go in against recommendations from Oracle.

This means that the issue is no longer relevant for me.
If you still want me to try it, just let me know.

Nathan Voxland May 13, 2015 at 9:55 PM

Can you try with a newer Liquibase version such as 3.3.3 ?

Chris Vesters May 6, 2015 at 1:55 PM

This was done with the System schema, which is not advised to be used to create database.
The default 'System' schema gives a lot of other troubles as well.

Details

Reporter

Components

Affects versions

Priority

Created May 5, 2015 at 2:50 PM
Updated May 18, 2015 at 1:52 AM

Flag notifications