如何在hsql中为另一个架构所有者创建表

时间:2017-10-18 21:58:29

标签: spring-batch hsqldb

我正在为Spring批处理应用程序编写测试用例。我需要设置一个镜像远程大型机db2数据库的HSQL数据库,以便我可以快速运行我的测试。

我必须以下面的SQL语句成功的方式设置db表:

SELECT PROJ_TYP, SYS_CD, ... FROM CMNREF.CNTRCT_EXTRNL_KEY_REF_V WITH UR

我相信上面的CMNREF是架构所有者。如何在HSQL数据库中创建该表和模式,以便此SELECT可以工作?

更新: 对here主题进行了一些研究,我了解到我需要做以下事情: 1)使用SA默认用户创建新用户CMNREF 2)向用户CMNREF(即SELECT)授予一些ROLES

但是,我也注意到默认用户SA具有DBA角色,这意味着它可以在该数据库上执行任何操作....所以我想知道我是否需要打扰创建上面的1和2 ...

我的测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/load-BMS-data-job-launcher-context.xml" })
public class SimpleJobLaunchFunctionalTests {

@Autowired
private JobLauncherTestUtils jobLauncherUtils;

@Qualifier("jdbcTemplate")
@Autowired
private JdbcOperations jdbcTemplate;

@Qualifier("jdbcTemplateBMS")
@Autowired
private JdbcOperations jdbcTemplateBMS;


@Before
public void setUp() {
    jdbcTemplateBMS.update("DELETE from CMNREF.CNTRCT_EXTRNL_KEY_REF_V");
    jdbcTemplate.update("DELETE from SHADOW_BMS");
 // jdbcTemplate.update("DELETE from CMNREF.CNTRCT_EXTRNL_KEY_REF_V");

    Calendar calendar = Calendar.getInstance();
    java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(calendar.getTime().getTime());

    // Insert one test data record
    jdbcTemplate.update("INSERT INTO CMNREF.CNTRCT_EXTRNL_KEY_REF_V(PROJ_TYP_CD, SYS_CD, STAT_CK_CD, EXTRNL_KEY_CD, EXTRNL_SYS_CD, CNTRCT_NUM, PROJ_NUM, CNTRCT_LINE_ITM, CUST_NUM, CUST_CNTL_NUM, CUST_NM, CHRG_CD, PRDCT_ID, BILNG_CRNCY_CD, BILNG_ISO_CRNCY_CD, BILNG_CRNCY_DCM_NUM, CFTS_CRNCY_EXCH_RT, CFTS_CRNCY_EXCH_RT_EXPIR_DT, CHRG_CRNCY_CD, CHRG_ISO_CRNCY_CD, CTRY_CD, CMPNY_CD, OFFERING_CD, CNTL_GRP_CD, ORIG_CTRY_CD, ORIG_CMPNY_CD, ORIG_LOC_CD, NOTES_ID, INET_ID, CFTS_GBI_IND, CFTS_CHRG_TYP_CD, CFTS_SPCL_HNDL_CD, CC_PMT_METH_IND, STAT_CD, REFRESH_TMS) VALUES('PROJT1', 'SCD', 'STC', 'EXTKEY','EXTSYSCODE', 'CTR923','PROJN293', 23, 'CNUM32', 'CN', 'NAME THIS CUST', 'CHCD', '2903-920','BCD', 'BIC', 23, 1.345, '2017-01-23','CCC', 'CIC', 'CCD', 'IBM', '9203L-98', 'CTLGRP', 'USA', 'IBM001', 'OLC', 'me@us.ibm.com', 'ME/US/IBM/COM', 'G', 'T', 'H', 'P', 'OPEN', '2016-01-02 19:29:23.271' )");

}

我的数据库脚本在那里:

CREATE USER CMNREF PASSWORD 'pw';
CREATE SCHEMA CMNREF AUTHORIZATION DBA;

ALTER USER CMNREF SET INITIAL SCHEMA CMNREF;

SET SCHEMA CMNREF;

CREATE TABLE CMNREF.CNTRCT_EXTRNL_KEY_REF_V  (
     PROJ_TYP_CD         VARCHAR(10),                 
     SYS_CD              VARCHAR(3),                  
     STAT_CK_CD          VARCHAR(12),                  
     EXTRNL_KEY_CD       VARCHAR(36),                  
     EXTRNL_SYS_CD       VARCHAR(10),                  
     CNTRCT_NUM          VARCHAR(15),                 
     PROJ_NUM            VARCHAR(8),                 
     CNTRCT_LINE_ITM     INTEGER,              
     CUST_NUM            VARCHAR(8),                
     CUST_CNTL_NUM       VARCHAR(2),                 
     CUST_NM             VARCHAR(35),               
     CHRG_CD             VARCHAR(4),                        
     PRDCT_ID            VARCHAR(15),               
     BILNG_CRNCY_CD      VARCHAR(3),                 
     BILNG_ISO_CRNCY_CD  VARCHAR(3),             
     BILNG_CRNCY_DCM_NUM SMALLINT,           
     CFTS_CRNCY_EXCH_RT  DECIMAL,           
     CFTS_CRNCY_EXCH_RT_EXPIR_DT   DATE,
     CHRG_CRNCY_CD       VARCHAR(3),                 
     CHRG_ISO_CRNCY_CD   VARCHAR(3),              
     CTRY_CD             VARCHAR(3),                
     CMPNY_CD            VARCHAR(10),                      
     OFFERING_CD         VARCHAR(8),                   
     CNTL_GRP_CD         VARCHAR(8),                  
     ORIG_CTRY_CD        VARCHAR(3),          
     ORIG_CMPNY_CD       VARCHAR(10),                
     ORIG_LOC_CD         VARCHAR(3),                   
     NOTES_ID            VARCHAR(100),          
     INET_ID             VARCHAR(100),          
     CFTS_GBI_IND        VARCHAR(1),          
     CFTS_CHRG_TYP_CD    VARCHAR(1),               
     CFTS_SPCL_HNDL_CD   VARCHAR(1),
     CC_PMT_METH_IND     VARCHAR(1),               
     STAT_CD             VARCHAR(12),          
     REFRESH_TMS         TIMESTAMP  
) ;

我的数据源在这里定义:

    <!--  Initialise the database before every test case: -->
<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="${batch.drop.script}"/>
    <jdbc:script location="${batch.schema.script}"/>
    <jdbc:script location="${batch.business.schema.script}"/>
</jdbc:initialize-database>

<!-- Initialize the mock BMS database  -->
<jdbc:initialize-database data-source="BMSdataSource" ignore-failures="DROPS">
    <jdbc:script location="${bmsmock.business.schema.script}"/>
</jdbc:initialize-database>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${batch.jdbc.driver}" />
    <property name="url" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />
    <property name="password" value="${batch.jdbc.password}" />
    <property name="maxActive" value="${batch.jdbc.pool.size}"/>
    <property name="validationQuery" value="${batch.jdbc.validationQuery}"/>
    <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/>
</bean>

<bean id="BMSdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${bmsmock.jdbc.driver}" />
    <property name="url" value="${bmsmock.jdbc.url}" />
    <property name="username" value="${bmsmock.jdbc.user}" />
    <property name="password" value="${bmsmock.jdbc.password}" />
    <property name="maxActive" value="${bmsmock.jdbc.pool.size}"/>
    <property name="validationQuery" value="${bmsmock.jdbc.validationQuery}"/>
    <property name="testWhileIdle" value="${bmsmock.jdbc.testWhileIdle}"/>
</bean> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- Set up or detect a System property called "ENVIRONMENT" used to construct a properties file on the classpath.  The default is "hsql".  -->
<bean id="environment"
    class="org.springframework.batch.support.SystemPropertyInitializer">
    <property name="defaultValue" value="hsql"/>
    <property name="keyName" value="ENVIRONMENT"/>
</bean>

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    depends-on="environment">
    <property name="location" value="classpath:batch-${ENVIRONMENT}.properties" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="order" value="1" />
</bean>

My HSQLDB Properties are below:

batch.jdbc.driver=org.hsqldb.jdbcDriver
batch.jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true;hsqldb.tx=mvcc
batch.jdbc.user=sa
batch.jdbc.password=
batch.jdbc.testWhileIdle=false
batch.jdbc.validationQuery=
batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-hsqldb.sql
batch.schema.script=classpath:/org/springframework/batch/core/schema-hsqldb.sql
batch.business.schema.script=classpath:/db/custom-db-assets.sql
batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.HsqlMaxValueIncrementer
batch.database.incrementer.parent=columnIncrementerParent
batch.lob.handler.class=org.springframework.jdbc.support.lob.DefaultLobHandler
batch.jdbc.pool.size=6
batch.grid.size=6
batch.verify.cursor.position=true
batch.isolationlevel=ISOLATION_SERIALIZABLE
batch.data.source.init=true
batch.table.prefix=BATCH_

bmsmock.jdbc.driver=org.hsqldb.jdbcDriver
bmsmock.jdbc.url=jdbc:hsqldb:mem:testbms;sql.enforce_strict_size=true;hsqldb.tx=mvcc
bmsmock.jdbc.user=SA
bmsmock.jdbc.password=
bmsmock.jdbc.pool.size=6
bmsmock.jdbc.testWhileIdle=false
bmsmock.jdbc.validationQuery=
bmsmock.business.schema.script=db/mock-bms-tables.sql

2 个答案:

答案 0 :(得分:0)

使用没有DBA角色的其他用户是个好主意。

在HSQLDB中,用户和架构是单独的概念,每个用户没有自动架构。你做得很好。或者你也可以

CREATE USER CMNREF PASSWORD 'pw'
CREATE SCHEMA CMNREF AUTHORIZATION CMNREF

通过上述内容,CMNREF用户拥有一个同名的模式。它可以在自己的架构中执行所有语句。

更新:在您的设置中,SA用户用于所有操作。您需要运行用户SA引用的DB脚本的用户创建部分,然后使用用户CMNREF运行测试。

答案 1 :(得分:0)

我的脚本(附件)显示了如何做到这一点。没错,脚本或模式定义没有错。我的问题是我的测试用例在将数据插入CMNREF.C *表时引用了错误的Jdbc模板....正确的stmt应该是:

jdbcTemplateBMS**.update("INSERT INTO CMNREF.CNTRCT_E

此外,我需要打开DB2模式以使我的sql脚本正常工作