-1

I'm trying to create a table on HANA service provided by SCP with trail account. The following codes use the com.sap.cloud.sdk.frameworks.liquibase.SchemaPerTenantProvisioner class to on board a tenant with the help of a Liquibase configuration file.

SchemaPerTenantProvisioner schemaProvisioner = new SchemaPerTenantProvisioner(connection, "PATH_TO_CONFIG");
schemaProvisioner.subscribeTenant("TenantID");

It then raise an exception and some useful messages. Details below.

Exception class: com.sap.db.jdbc.exceptions.JDBCDriverException
Exception Message: SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "IF": line 1 col 15 (at pos 15)

Call stack as following.

com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "IF": line 1 col 15 (at pos 15)
    at com.sap.db.jdbc.exceptions.SQLExceptionSapDB._newInstance(SQLExceptionSapDB.java:195)
    at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.newInstance(SQLExceptionSapDB.java:45)
    at com.sap.db.jdbc.packet.HReplyPacket._buildExceptionChain(HReplyPacket.java:841)
    at com.sap.db.jdbc.packet.HReplyPacket.getSQLExceptionChain(HReplyPacket.java:158)
    at com.sap.db.jdbc.packet.HPartInfo.getSQLExceptionChain(HPartInfo.java:39)
    at com.sap.db.jdbc.ConnectionSapDB._receive(ConnectionSapDB.java:4214)
    at com.sap.db.jdbc.ConnectionSapDB.exchange(ConnectionSapDB.java:1660)
    at com.sap.db.jdbc.PreparedStatementSapDB._prepare(PreparedStatementSapDB.java:2733)
    at com.sap.db.jdbc.PreparedStatementSapDB._doParse(PreparedStatementSapDB.java:2615)
    at com.sap.db.jdbc.PreparedStatementSapDB.<init>(PreparedStatementSapDB.java:156)
    at com.sap.db.jdbc.HanaPreparedStatement.<init>(HanaPreparedStatement.java:42)
    at com.sap.db.jdbc.HanaPreparedStatementFinalize.<init>(HanaPreparedStatementFinalize.java:39)
    at com.sap.db.jdbc.HanaPreparedStatementFinalize.newInstance(HanaPreparedStatementFinalize.java:23)
    at com.sap.db.jdbc.ConnectionSapDB._prepareStatement(ConnectionSapDB.java:2390)
    at com.sap.db.jdbc.ConnectionSapDB.prepareStatement(ConnectionSapDB.java:289)
    at com.sap.cloud.sdk.frameworks.liquibase.SchemaPerTenantProvisioner.subscribeTenant(SchemaPerTenantProvisioner.java:113)
    at com.sap.cloud.s4hana.examples.addressmgr.TenantProvisioningServlet.doPut(TenantProvisioningServlet.java:42)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:663)
    at com.sap.cloud.s4hana.examples.addressmgr.util.HttpServlet.service(HttpServlet.java:15)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextServletFilter.lambda$doFilter$0(RequestContextServletFilter.java:171)
    at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextCallable.call(RequestContextCallable.java:95)
    at com.sap.cloud.sdk.cloudplatform.servlet.RequestContextServletFilter.doFilter(RequestContextServletFilter.java:173)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpCachingHeaderFilter.doFilter(HttpCachingHeaderFilter.java:57)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter.doFilter(HttpSecurityHeadersFilter.java:42)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at com.sap.xs.security.container.XSSecurityAuthenticator.invoke(XSSecurityAuthenticator.java:134)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at com.sap.xs.java.valves.ErrorReportValve.invoke(ErrorReportValve.java:66)
    at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:256)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at com.sap.xs.jdbc.datasource.valve.JDBCValve.invoke(JDBCValve.java:62)
    at com.sap.xs.security.UserInfoValve.invoke(UserInfoValve.java:19)
    at com.sap.xs.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:43)
    at com.sap.xs.logging.catalina.RuntimeInfoValve.invoke(RuntimeInfoValve.java:40)
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:836)

Additional Useful message:

WARNING 3/13/20 5:18 AM: liquibase: Unknown database: HDB

By viewing the source codes of com.sap.cloud.sdk.frameworks.liquibase.SchemaPerTenantProvisioner, within which there is some codes where the exception message points to.

final PreparedStatement statement =
                connection.prepareStatement("CREATE SCHEMA IF NOT EXISTS \"" + schemaName + "\"")

It seems this statement cannot be recognized. Here are more information from information of Hibernate.

HHH000401: using driver [null] at URL [jdbc:sap://zeus.hana.prod.eu-central-1.whitney.xxxx.ondemand.com:23803/null?user=...
HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
HHH000412: Hibernate Core {4.3.0.Final}
HHH000206: hibernate.properties not found
HHH000021: Bytecode provider name : javassist
HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
HHH000402: Using Hibernate built-in connection pool (not for production use!)
HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
HHH000397: Using ASTQueryTranslatorFactory
HHH000400: Using dialect: org.hibernate.dialect.HANAColumnStoreDialect

BTW, I search the whole project, there is no use of javax.persistence.spi.PersistenceProvider at all. I'm wondering why the first warning appears.

Here is my pom.xml related to Cloud SDK and Persistency.

<!-- S/4 Cloud SDK -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.sap.cloud.s4hana</groupId>
                <artifactId>sdk-bom</artifactId>
                <version>2.28.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


        <dependency>
            <groupId>com.sap.cloud.s4hana.cloudplatform</groupId>
            <artifactId>scp-cf</artifactId>
            </dependency>
        <dependency>
            <groupId>com.sap.cloud.s4hana</groupId>
            <artifactId>s4hana-all</artifactId>
        </dependency>

<!-- Persistency -->
        <dependency>
            <groupId>com.sap.cloud.s4hana.frameworks</groupId>
            <artifactId>liquibase</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-cloudfoundry-connector</artifactId>
            <version>1.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.sap.hana.cloud</groupId>
            <artifactId>spring-cloud-cloudfoundry-hana-service-connector</artifactId>
            <version>1.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.sap.cloud.db.jdbc</groupId>
            <artifactId>ngdbc</artifactId>
            <version>2.4.70</version>
            <scope>test</scope>
        </dependency>

Any idea on what's missing/wrong?

aicro
  • 11
  • 6

2 Answers2

1

It seems it's not my codes fault or missing any dependencies.

I've tried to use WebIDE within SCP to view my HANA HDI container, within which I try to write SQL

create schema if not exist "abc"

The syntax is incorrect and when execute the same error message prompts.

Error: (dberror) [257]: sql syntax error: incorrect syntax near "if": line 1 col 14 (at pos 15)

In addition, I try to create a schema with following codes.

create schema "abc"

It complains with the following error for lack of privilege.

Error: (dberror) [258]: insufficient privilege

So I refer to here for more information about HDI container. It seems that with HDI the developer can access DB artifacts only within your "local schema" created by HDI when binding application. You obviously do not privileges to create schema.

Finally, I think the question itself is a pseudo-proposition. I take examples for creating schema for PostgreSQL and hope that will work on HANA HDI container, regardless how HDI works.

aicro
  • 11
  • 6
0

Can you please also add the version of SAP cloud sdk that you are using? Also if you are using version 2, please consider migrating to version 3, as version 2 is currently in maintenance mode.

Can you also please include the stack trace in the question? This would help us to analyse the issue better.

Ksivakumar
  • 188
  • 1
  • 7
  • Could you please show me how to see the version of cloud SDK? I search in the version of the artifct scp-cf and s4hana-all, the latest version of both are 2.28.0. The main codes are cloned from samples [here](https://github.com/SAP/cloud-s4-sdk-book/tree/course/2_4_multitenancy). – aicro Mar 17 '20 at 02:21
  • 2.28.0 is the right version, I can see that in the pom included in the question above, the sdk-bom version is 2.28.0. – Ksivakumar Mar 18 '20 at 08:52
  • You can also check it [here](https://repo1.maven.org/maven2/com/sap/cloud/s4hana/sdk-bom/2.28.0/sdk-bom-2.28.0.pom) where you can see the `s4sdk.version` info. – Ksivakumar Mar 18 '20 at 09:00