2013-01-16 85 views
2

我希望Maven执行sql文件,它生成的数据库模式将在以后用于我的程序中。但它不起作用,可能是由'DELIMITER'造成的。当我执行 'MVN SQL:执行',它打印的是执行mvn sql时出错:执行

[ERROR] Failed to execute: DELIMITER $$ 

这里是我的pom.xml的一部分

 <plugin> 
      <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.21</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>init-schema</id> 
        <goals> 
         <goal>site</goal> 
        </goals> 
        <phase>deploy</phase> 
       </execution> 
      </executions> 
      <configuration> 
       <driver>com.mysql.jdbc.Driver</driver> 
       <username>root</username> 
       <password>root</password> 
       <url>jdbc:mysql://127.0.0.1:3306/?useUnicode=true&amp;characterEncoding=UTF-8</url> 
       <autocommit>false</autocommit> 
       <srcFiles> 
        <srcFile>src/main/sql/jellyjolly-schema.sql</srcFile> 
       </srcFiles> 
      </configuration> 
     </plugin> 

这里是我的SQL文件的一部分

DELIMITER $$ 

USE `jellyjolly_schema`$$ 
DROP TRIGGER IF EXISTS `jellyjolly_schema`.`delete_user` $$ 
USE `jellyjolly_schema`$$ 


CREATE TRIGGER delete_user 
AFTER DELETE 
ON jj_users 
FOR EACH ROW 
BEGIN 
    ## delete the posts that belong to the user 
    DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id; 
END 
$$ 

是这是因为关键字'DELIMITER'不受由Maven调用的MySQL Java连接器的支持。那我该如何解决呢?在此page

 

    &ltconfiguration> 
    &ltdelimiter>$$</delimiter> 
    </configuration> 
 

更多关于此配置参数:

+0

你为什么使用这样一个奇怪的分隔符。通常的分隔符是“;”。 – khmarbaise

+0

@khmarbaise如果我使用分隔符';',';'不能出现在声明语句中。例如,'DELETE FROM jj_blog_posts WHERE author_user_id = OLD.user_id;'不能以';'结尾 – rAy

+0

我同意这可能是一个更优雅的解决方案。你可以看看[这个问题](http://stackoverflow.com/questions/13072354/sql-maven-plugin-with-multiple-delimiters)的灵感。 –

回答

1

在阅读您的意见后,我相信最好的解决方案是一个accepted here。也就是说,只使用一个分隔符(最好是默认值;)并使用sql-maven-plugin配置为,要求分隔符在其自己的行上发生以实际为分隔符。

 

    &ltconfiguration> 
     &ltdelimiterType&gtrow</delimiterType> 
    </configuration> 
 

(信用@Zheka

那么,您的触发会是什么样子:

CREATE TRIGGER delete_user 
AFTER DELETE 
ON jj_users 
FOR EACH ROW 
BEGIN 
    ## delete the posts that belong to the user 
    DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id; # this delimiter is ignored 
END 
; # this delimiter is recognized 
0

你可以像这样指定的sql-maven-plugin配置一个新的分隔符。

+0

如果部分sql使用分隔符;另一部分使用分隔符$$,如何处理它? – rAy

+0

我不相信这是可能的,对不起。 –

0

如果哟ü不想使用<delimiterType>row</delimiterType>另一种方式来做到这一点,除了肖恩的答案是去掉DELIMITER $$和$$,并在插件中使用分号以外的分号。

首先更改插件的分隔符,例如

<delimiter>;;</delimiter> 

接着上面的例子中的触发器将如

USE `jellyjolly_schema`;; 
DROP TRIGGER IF EXISTS `jellyjolly_schema`.`delete_user`;; 
USE `jellyjolly_schema`;; 


CREATE TRIGGER delete_user 
AFTER DELETE 
ON jj_users 
FOR EACH ROW 
BEGIN 
    ## delete the posts that belong to the user 
    DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id; 
END;; 

,或者你可以用别的东西作为插件和变化的分隔符触发 ;;据此