2017-10-18 5 views
0

Je suis en train d'écrire des cas de test pour une application de traitement par lots de printemps. Je dois installer une base de données HSQL qui reflète une base de données à distance de l'ordinateur central db2 afin que je puisse exécuter mes tests rapidement.comment puis-je créer une table pour un autre propriétaire de schéma dans hsql

je dois paramétrer la table db, comme manière que l'instruction SQL suivante réussira:

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

je crois que le CMNREF ci-dessus est le propriétaire du schéma. Comment puis-je créer cette table et ce schéma dans HSQL db afin que SELECT fonctionne?

Mise à jour: Faire des recherches sur le sujet here, je l'ai appris que je dois faire ce qui suit: 1) Utiliser l'utilisateur par défaut SA pour créer un nouvel utilisateur CMNREF 2) accorder quelques RÔLES à l'utilisateur CMNREF (c'est à dire SELECT)

Cependant, j'ai également remarqué que l'utilisateur par défaut SA a le rôle DBA, ce qui signifie qu'il peut faire n'importe quoi sur cette base de données .... donc je me demande si j'ai même besoin de créer 1 et 2 ci-dessus ....

Mon cas d'essai:

@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')"); 

} 

Mon DB Script est là:

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 
) ; 

Mes sources de données sont définies ici:

<!-- 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

Quelques recherches ci-dessus .... – JamesD

Répondre

0

Il est une bonne idée d'utiliser un autre utilisateur sans le rôle de DBA.

Dans HSQLDB un utilisateur et un schéma sont des concepts distincts, sans schéma automatique par utilisateur. Ce que vous avez fait est bien. Sinon, vous pouvez

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

Avec ce qui précède, l'utilisateur CMNREF possède un schéma du même nom. Il peut exécuter toutes les instructions dans son propre schéma.

mise à jour: Dans vos paramètres de l'utilisateur SA est utilisé pour toutes les opérations. Vous devez exécuter la section de création d'utilisateur du script DB vous avez cité avec l'utilisateur SA, puis exécutez les tests avec l'utilisateur CMNREF.

+0

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; mauvaise grammaire SQL [INSERT INTO CNTRCT_EXTRNL_KEY_REF_V (PROJ_TYP_CD ... 'ME/US/IBM/COM', 'G', 'T', 'H', 'P', 'OUVRIR', '2016-01-02 19: 29: 23.271 ')]; exception imbriquée est java.sql.SQLSyntaxErrorException: l'utilisateur n'a pas le privilège ou objet introuvable: CNTRCT_EXTRNL_KEY_REF_V – JamesD

+0

J'ai lancé le HSQL mgr comme ceci: java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing je peux courir toutes les commandes là-bas et je peux insérer et sélectionner des données ... pourquoi pas dans le SpringJdbcTemplate? – JamesD

+0

Utilisez exactement la même URL de connexion dans DBManager et Spring pour obtenir le même comportement. – fredt

0

Mon script (ci-joint) montre exactement comment le faire. C'est vrai, rien de mal avec le script ou la définition du schéma. Mon problème était que mon cas de test a été référait au modèle Jdbc mal lors de l'insertion des données dans la table CMNREF.C de * .... aurait dû être le stmt correct:

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

, je dois aussi pour allumer le Mode DB2 pour que mon script sql fonctionne correctement