DBFlute新規導入時の初回のReplaceSchemaで「Failed to drop foreign keys!」というエラーが発生する

178 views
Skip to first unread message

reso...@gmail.com

unread,
Apr 26, 2019, 9:04:06 AM4/26/19
to DBFluteユーザの集い
お世話になっております。

業務外でDBFluteの新規導入を行う際、初回のReplaceSchemaを実行すると
「Failed to drop foreign keys!」というエラーが発生します。
詳細な情報を以下に記載致します。

replace-schemaタスク実行時にまずスキーマ初期化が実行されるため、そこで存在していない
FKを削除しにいってしまって発生しているのではないかと考えております。
------------------詳細情報------------------
環境情報
Java: JavaSE-1.7
DB: PostgreSQL 10.7
DBFlute: 1.0.5N

replace-shema.sql
create table mst_task (
  id  
int,
 name  varchar(20),
 detail text
);


エラーログ
[df-replace-schema] 2019-04-26 08:38:27,231 ERROR - Look! Read the message below.
[df-replace-schema] /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
[df-replace-schema] Failed to execute DBFlute Task 'ReplaceSchema'.
[df-replace-schema]
[df-replace-schema] [Advice]
[df-replace-schema] Check the exception messages and the stack traces.
[df-replace-schema]
[df-replace-schema] [Database Product]
[df-replace-schema] PostgreSQL 10.7
[df-replace-schema]
[df-replace-schema] [JDBC Driver]
[df-replace-schema] PostgreSQL Native Driver PostgreSQL 8.4 JDBC3 (build 701) for JDBC 3.0
[df-replace-schema] * * * * * * * * * */
[df-replace-schema] org.seasar.dbflute.exception.SQLFailureException: Failed to drop foreign keys!
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.callbackDropForeignKeyByJdbc(DfSchemaInitializerJdbc.java:315)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.dropForeignKey(DfSchemaInitializerJdbc.java:285)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.executeTableProcess(DfSchemaInitializerJdbc.java:196)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.executeObject(DfSchemaInitializerJdbc.java:171)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.initializeSchema(DfSchemaInitializerJdbc.java:106)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.process.DfCreateSchemaProcess.initializeSchemaMainDrop(DfCreateSchemaProcess.java:219)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.process.DfCreateSchemaProcess.initializeSchema(DfCreateSchemaProcess.java:165)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.process.DfCreateSchemaProcess.execute(DfCreateSchemaProcess.java:140)
[df-replace-schema]     at org.seasar.dbflute.task.DfReplaceSchemaTask.createSchema(DfReplaceSchemaTask.java:252)
[df-replace-schema]     at org.seasar.dbflute.task.DfReplaceSchemaTask.doExecuteCoreProcess(DfReplaceSchemaTask.java:241)
[df-replace-schema]     at org.seasar.dbflute.task.DfReplaceSchemaTask.executeCoreProcess(DfReplaceSchemaTask.java:236)
[df-replace-schema]     at org.seasar.dbflute.task.DfReplaceSchemaTask.processMain(DfReplaceSchemaTask.java:229)
[df-replace-schema]     at org.seasar.dbflute.task.DfReplaceSchemaTask.doExecute(DfReplaceSchemaTask.java:157)
[df-replace-schema]     at org.seasar.dbflute.task.bs.DfAbstractTexenTask$1.callActualExecute(DfAbstractTexenTask.java:130)
[df-replace-schema]     at org.seasar.dbflute.task.bs.assistant.DfTaskBasicController.doExecute(DfTaskBasicController.java:183)
[df-replace-schema]     at org.seasar.dbflute.task.bs.assistant.DfTaskBasicController.execute(DfTaskBasicController.java:77)
[df-replace-schema]     at org.seasar.dbflute.task.bs.DfAbstractTexenTask.execute(DfAbstractTexenTask.java:152)
[df-replace-schema]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
[df-replace-schema]     at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
[df-replace-schema]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[df-replace-schema]     at java.lang.reflect.Method.invoke(Method.java:498)
[df-replace-schema]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
[df-replace-schema]     at org.apache.tools.ant.Task.perform(Task.java:348)
[df-replace-schema]     at org.apache.tools.ant.Target.execute(Target.java:357)
[df-replace-schema]     at org.apache.tools.ant.Target.performTasks(Target.java:385)
[df-replace-schema]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
[df-replace-schema]     at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
[df-replace-schema]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[df-replace-schema]     at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
[df-replace-schema]     at org.apache.tools.ant.Main.runBuild(Main.java:698)
[df-replace-schema]     at org.apache.tools.ant.Main.startAnt(Main.java:199)
[df-replace-schema]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
[df-replace-schema]     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
[df-replace-schema] Caused by: org.postgresql.util.PSQLException: ERROR: column t1.tgconstrname does not exist
[df-replace-schema]   Position: 113
[df-replace-schema]     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
[df-replace-schema]     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
[df-replace-schema]     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
[df-replace-schema]     at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
[df-replace-schema]     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
[df-replace-schema]     at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:252)
[df-replace-schema]     at org.postgresql.jdbc2.AbstractJdbc2DatabaseMetaData.getImportedExportedKeys(AbstractJdbc2DatabaseMetaData.java:3272)
[df-replace-schema]     at org.postgresql.jdbc2.AbstractJdbc2DatabaseMetaData.getImportedKeys(AbstractJdbc2DatabaseMetaData.java:3465)
[df-replace-schema]     at org.seasar.dbflute.logic.jdbc.metadata.basic.DfForeignKeyExtractor.extractForeignKeyMetaData(DfForeignKeyExtractor.java:213)
[df-replace-schema]     at org.seasar.dbflute.logic.jdbc.metadata.basic.DfForeignKeyExtractor.doGetForeignKeyMap(DfForeignKeyExtractor.java:116)
[df-replace-schema]     at org.seasar.dbflute.logic.jdbc.metadata.basic.DfForeignKeyExtractor.getForeignKeyMap(DfForeignKeyExtractor.java:95)
[df-replace-schema]     at org.seasar.dbflute.logic.jdbc.metadata.basic.DfForeignKeyExtractor.getForeignKeyMap(DfForeignKeyExtractor.java:80)
[df-replace-schema]     at org.seasar.dbflute.logic.replaceschema.schemainitializer.DfSchemaInitializerJdbc.callbackDropForeignKeyByJdbc(DfSchemaInitializerJdbc.java:304)
[df-replace-schema]     ... 32 more
[




ソースコードの発生箇所
    protected void callbackDropForeignKeyByJdbc(Connection conn, List<DfTableMeta> tableMetaList, DfDropForeignKeyByJdbcCallback callback) {

        Statement st = null;
       try {
           st = conn.createStatement();
           for (DfTableMeta tableMeta : tableMetaList) {
               if (isSkipDropForeignKey(tableMeta)) {
                   continue;
               }
               final DfForeignKeyExtractor extractor = new DfForeignKeyExtractor();
               extractor.suppressExceptTarget();

                final DatabaseMetaData dbMetaData = conn.getMetaData();
               final Map<String, DfForeignKeyMeta> foreignKeyMetaInfoMap = extractor.getForeignKeyMap(conn, dbMetaData, tableMeta);
               final Set<String> keySet = foreignKeyMetaInfoMap.keySet();
               for (String foreignKeyName : keySet) {
                   final DfForeignKeyMeta foreignKeyMetaInfo = foreignKeyMetaInfoMap.get(foreignKeyName);
                   final String dropForeignKeySql = callback.buildDropForeignKeySql(foreignKeyMetaInfo);
                   logReplaceSql(dropForeignKeySql);
                   st.execute(dropForeignKeySql);
               }
           }
       } catch (SQLException e) {
           String msg = "Failed to drop foreign keys!";
           throw new SQLFailureException(msg, e);
       } finally {
           closeStatement(st);
       }
   }






kubo

unread,
Apr 26, 2019, 9:14:53 AM4/26/19
to DBFluteユーザの集い
jfluteです

resotto3さん、こんばんは
業務外でのDBFluteの導入ありがとうございます!

> [df-replace-schema] Caused by: org.postgresql.util.PSQLException: ERROR: column t1.tgconstrname does not exist
> [df-replace-schema] Position: 113

ネストした例外に着目してみると良いです。
「t1.tgconstrname」がポイントのようですね。

単純にググると pg_trigger がヒットします。
https://www.postgresql.jp/document/8.3/html/catalog-pg-trigger.html

システムカタログのようなので、システムの情報まで見に行ってしまっているようですね。

さらに、このようなページもヒットしました。
(slick / slickCodegen) column t1.tgconstrname does not exi:
https://groups.google.com/forum/#!topic/scalaquery/ba7aIewz8g4
Column t1.tgconstrname does not exist:
https://liquibase.jira.com/browse/CORE-3135

詳しく読めてないですが、
他のツールでも似たような現象が発生しているのかもしれません。


まず、PostgreSQLのDB接続設定は、想定どおりでしょうか?
(システム情報が見えてしまうような接続になっていないかどうか?)
http://dbflute.seasar.org/ja/manual/reference/dbway/postgresql/index.html#setting

PostgreSQL 10.7とかなり最新なので、
DBFlute Engine が利用しているPostgreSQLのJDBCドライバーを、
最新にしてみるとどうなるでしょうか?libの下のjarを差し替えてみてください。
(ちなみに、DBFlute-1.1.x系だと postgresql-9.4.1212.jre6.jar を使っています)

reso...@gmail.com

unread,
Apr 26, 2019, 8:26:55 PM4/26/19
to DBFluteユーザの集い
jflute様

お世話になっております。また早速のお返事、誠にありがとうございます。

スタックトレースの結果に囚われすぎて、真の原因を追えておりませんでした。
ご指摘ありがとうございます。

dbflute-1.0.5Nインストール時に付属するドライバーpostgresql-8.4-701.jdbc3.jarを、
postgresql-42.2.5.jre7.jar に入れ替えましたら、Replace-Schemaが成功致しました。

ご教授頂きありがとうございました。

2019年4月26日金曜日 22時04分06秒 UTC+9 reso...@gmail.com:

kubo

unread,
Apr 27, 2019, 1:30:23 AM4/27/19
to DBFluteユーザの集い
jfluteです

おおぉ、良かったです。
(どのJDBCバージョンからOKなんだろう!?って気になりますが)

ちなみにですが、新規導入であれば、
Java8版 (1.1.x系) の方をオススメしております。

もし、よければJava8を利用して頂ければ。
何かあったときにもっと深くサポートできるかなと思います。

Reply all
Reply to author
Forward
0 new messages