如何使用maven脚本在DB2中创建和删除数据库

时间:2014-01-15 22:48:01

标签: database maven db2 maven-plugin

我正在尝试运行maven脚本并删除并创建数据库。

这是我的xml

.....
<plugin>
    <!-- Used to automatically drop (if any) and create a database prior 
        to running integration test cases. -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>sql-maven-plugin</artifactId>
    <version>1.5</version>
    <dependencies>
        <!-- <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.22</version>
        </dependency> -->
        <dependency>
            <groupId>db2.connector</groupId>
            <artifactId>db2.connector</artifactId>
            <version>10.5.0.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/../data/target/db2jcc.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>db2.connector</groupId>
            <artifactId>db2.connector4</artifactId>
            <version>10.5.0.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/../data/target/db2jcc4.jar</systemPath>
        </dependency>
    </dependencies>
    <configuration>
        <!-- common configuration shared by all executions -->
            <driver>com.ibm.db2.jcc.DB2Driver</driver>
            <username>db2inst1</username>
            <password>password</password>
            <url>jdbc:db2://192.168.0.81:50000/db</url>
            <forceMojoExecution>true</forceMojoExecution>
        </configuration>
        <executions>
            <execution>
                <id>drop-db-before-test-if-any</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <autocommit>true</autocommit>
                    <sqlCommand>drop database db</sqlCommand>
                    <onError>continue</onError>
                </configuration>
            </execution>
            <execution>
                <id>create-db</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <autocommit>true</autocommit>
                    <sqlCommand>create database db</sqlCommand>
                </configuration>
            </execution>
            <execution>
                <id>create-schema</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <url>jdbc:db2://192.168.0.81:50000/sample</url>
                    <autocommit>true</autocommit>
                    <srcFiles>
                        <srcFile>${basedir}/../data/src/main/resources/create_database_db2.sql</srcFile>
                    </srcFiles>
                </configuration>
            </execution>
        </executions>
    </plugin>
.....

我得到的错误是

[ERROR] com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104,
 SQLSTATE=42601, SQLERRMC=database;drop ;<program_or_package>, DRIVER=3.66.46
[INFO] 0 of 1 SQL statements executed successfully

create db。

的类似错误

我在这做错了什么?

2 个答案:

答案 0 :(得分:1)

我不是Maven专家,但您遇到的问题是,当它是DROP DATABASE命令时,您尝试将DB2 Command-Line processor作为SQL命令运行。

This thread可能会有所帮助,它是关于用Java运行DB2 CLP命令。

答案 1 :(得分:1)

正如Bhamby所说,你不能执行“创建数据库”,也不能执行“删除数据库”作为SQL命令。这就是你遇到这类错误的原因。

通过exec-maven-plugin命令脚本

您可以做的是从Maven执行命令,但在此之前,您必须确保正确加载DB2环境。您可以使用exec-maven-plugin插件,但不是执行不同的命令来加载DB2配置文件然后创建数据库,您可以做的是编写一个脚本,它将接收数据库名称作为参数,脚本将创建数据库。这里的问题是你必须为Linux编写一个,为Windows编写一个。例如在linux中:

create.sh

#!/bin/bash
. /home/db2inst1/sqllib/db2profile
db2 create db $1

此处的实例主目录是:/ home / db2inst1。

此外,您必须确定,用于执行Maven的用户在实例上具有创建新数据库的必要权限。我的意思是,用户应该在sysadm或sysctrl组中:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0001941.html

<强>爪哇

您无法通过Java创建数据库,因为DB2 API不为此提供Java API。相反,您可以从JNI创建C routine called并在Java中调用它。通过这种方式,您可以从Java个性化创建/删除过程,而不是从脚本中个性化。