sql2o 无法在 oracle DB 上删除
Posted
技术标签:
【中文标题】sql2o 无法在 oracle DB 上删除【英文标题】:sql2o unable to delete on oracle DB 【发布时间】:2018-03-16 17:09:14 【问题描述】:我正在尝试在项目中使用 sq2o。它在 MSSQL 下运行良好,但在切换到 Oracle DB 12c 时出现删除问题
public void delete(final String x, final String y)
final String query = "DELETE FROM XXX WHERE columnx = :x AND columny = :y";
try (final Connection con = sql2o.beginTransaction();
final Query q = con.createQuery(query))
q.addParameter("x", x);
q.addParameter("y", y);
q.executeUpdate();
con.commit();
当我使用这种方法时,我会得到相当神秘的日志:
操作不允许 org.sql2o.Sql2oException: Error in 执行更新,操作不允许在 org.sql2o.Query.executeUpdate(Query.java:527) 在 com.fusionrisk.authorisation.impl.AuthorisationRoleDao.delete(AuthorisationRoleDao.java:55) 在 com.fusionrisk.authorisation.impl.AuthorisationService.deleteUserRole(AuthorisationService.java:43) 在 fusionrisk.rest.AuthorisationResource.deleteRole(AuthorisationResource.java:59) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) 在 org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103) 在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:315) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:297) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:267) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297) 在 org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:372) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:800) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) 在 org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83) 在 org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:300) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:224) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
在 com.trmsys.cargo.shield.web.filter.PrincipalShiroFilter.doFilter(PrincipalShiroFilter.java:228) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) 在 com.trmsys.cargo.shield.shiro.web.ShieldFilter.access$100(ShieldFilter.java:34) 在 com.trmsys.cargo.shield.shiro.web.ShieldFilter$1.call(ShieldFilter.java:99) 在 org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) 在 org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) 在 org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) 在 com.trmsys.cargo.shield.shiro.web.ShieldFilter.doFilterInternal(ShieldFilter.java:95) 在 org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 com.trmsys.cargo.security.cors.impl.CorsFilter.handleSimpleCORS(CorsFilter.java:345) 在 com.trmsys.cargo.security.cors.impl.CorsFilter.doFilter(CorsFilter.java:188) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 com.trmsys.cargo.rs.shared.impl.http.RequestLogFilter.doFilter(RequestLogFilter.java:59) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在 org.eclipse.jetty.server.Server.handle(Server.java:497) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248) 在 org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540) 在 java.lang.Thread.run(Thread.java:745) 引起: java.sql.SQLException:不允许操作 oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:5174) 在 oracle.jdbc.driver.OracleStatementWrapper.getGeneratedKeys(OracleStatementWrapper.java:352) 在 org.apache.commons.dbcp.DelegatingStatement.getGeneratedKeys(DelegatingStatement.java:315) 在 org.apache.commons.dbcp.DelegatingStatement.getGeneratedKeys(DelegatingStatement.java:315) 在 org.sql2o.Query.executeUpdate(Query.java:522) ... 67 常见 框架省略
只是为了删除。插入和检索运行良好。
我在谷歌上搜索了这个问题,但唯一的结果是解决了封闭的 resulSet,这不是这里的情况。
【问题讨论】:
【参考方案1】:根据错误
operation not allowed org.sql2o.Sql2oException: Error in executeUpdate, operation not allowed at org.sql2o.Query.executeUpdate(Query.java:527) at
我会说删除权限缺失。将其授予用户并重试。
【讨论】:
【参考方案2】:这不是一个很好的答案,但我最近一直在 Eclipse 下使用 sql2o 进行开发,我发现找出一些问题的唯一方法是使用源代码构建并跟踪到引发异常的位置。耗时,但比在黑暗中拍摄要少。
【讨论】:
以上是关于sql2o 无法在 oracle DB 上删除的主要内容,如果未能解决你的问题,请参考以下文章
安装 oracle db 10g 后 xampp apache 无法启动。怎么修?
在win10上安装Oracle11g 出现无法实例化怎样解决
Perl 无法在 cronjob 中连接到 Oracle DB