2017-10-18 321 views
0

我正在编写Spring批处理应用程序的测试用例。我需要设置一个反映远程大型机db2数据库的HSQL数据库,以便我可以快速运行我的测试。如何在hsql中为另一个模式所有者创建表

我必须设置db表在诸如方式,下面的SQL语句将成功:

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

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

更新: 这样的话题here一些研究,我了解到,我需要做到以下几点: 1)使用默认的SA用户创建新的用户CMNREF 2)授予一定的作用,以用户CMNREF(即SELECT)

但是,我还注意到,默认用户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', '[email protected]', 'ME/US/IBM/COM', 'G', 'T', 'H', 'P', 'OPEN', '2016-01-02 19:29:23.271')"); 

} 

我的DB脚本有:

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 
+0

上面的一些研究.... – JamesD

回答

0

它是使用不同的用户无需DBA角色是个好主意。

在HSQLDB中,用户和模式是不同的概念,每个用户都没有自动模式。你所做的很好。另外,您可以

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

通过以上的CMNREF用户拥有相同名称的架构。它可以在自己的模式中执行所有语句。

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

+0

org.springframework.jdbc.BadSqlGrammarException:StatementCallback;错误的SQL语法[INSERT INTO CNTRCT_EXTRNL_KEY_REF_V(PROJ_TYP_CD ...'ME/US/IBM/COM','G','T','H','P','OPEN','2016-01-02 19: 29:23.271')];嵌套异常是java.sql.SQLSyntaxErrorException:用户缺少权限或对象没有找到:CNTRCT_EXTRNL_KEY_REF_V – JamesD

+0

我已经启动了HSQL mgr像这样: java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing 我可以运行所有的命令在那里,我可以插入和选择数据...为什么不在SpringJdbcTemplate中? – JamesD

+0

在DBManager和Spring中使用完全相同的连接URL来获得相同的行为。 – fredt

0

我的脚本(附件)显示了如何操作。这是正确的,脚本或模式定义没有错。我的问题是,将数据插入到CMNREF.C *表时,我的测试案例是指的错误的jdbc模板....正确的语句应该是:

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

而且,我需要打开DB2模式为我的SQL脚本正常工作

相关问题