2017-10-18 322 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腳本正常工作

相關問題