Problems with dropAll and Firebird

Firebird 2.1.x
Jaybird 2.1.1
Liquibase 1.9.4

I’m having difficulty getting Liquibase’s dropAll to work, reliably, against my Firebird database.  It randomly fails with something like the following:

    [java] Migration Failed: GDS Exception. 335544351. unsuccessful metadata update     [java] object INDEX is in use     [java] Reason: unsuccessful metadata update     [java] object INDEX is in use.  For more information, use the --logLevel flag)     [java] Oct 13, 2009 4:40:05 PM liquibase.commandline.Main main     [java] SEVERE: GDS Exception. 335544351. unsuccessful metadata update     [java] object INDEX is in use     [java] Reason: unsuccessful metadata update     [java] object INDEX is in use     [java] liquibase.exception.JDBCException: Error executing SQL ALTER TABLE CONFIG_ITEM_HISTORY DROP CONSTRAINT FKF0A31525DF74E053     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:55)     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:86)     [java]      at liquibase.database.AbstractDatabase.dropDatabaseObjects(AbstractDatabase.java:846)     [java]      at liquibase.Liquibase.dropAll(Liquibase.java:449)     [java]      at liquibase.Liquibase.dropAll(Liquibase.java:436)     [java]      at liquibase.commandline.Main.doMigration(Main.java:613)     [java]      at liquibase.commandline.Main.main(Main.java:97)     [java]      at com....     [java] Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544351. unsuccessful metadata update     [java] object INDEX is in use     [java] Reason: unsuccessful metadata update     [java] object INDEX is in use     [java]      at org.firebirdsql.jdbc.InternalTransactionCoordinator$AutoCommitCoordinator.statementCompleted(InternalTransactionCoordinator.java:261)     [java]      at org.firebirdsql.jdbc.InternalTransactionCoordinator.statementCompleted(InternalTransactionCoordinator.java:55)     [java]      at org.firebirdsql.jdbc.AbstractStatement.notifyStatementCompleted(AbstractStatement.java:254)     [java]      at org.firebirdsql.jdbc.AbstractStatement.notifyStatementCompleted(AbstractStatement.java:249)     [java]      at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:590)     [java]      at liquibase.database.template.JdbcTemplate$1ExecuteStatementCallback.doInStatement(JdbcTemplate.java:78)     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:48)     [java]      ... 9 more

or this:

    [java] Migration Failed: GDS Exception. 335544351. unsuccessful metadata update     [java] ERASE RDB$RELATION_CONSTRAINTS failed     [java] action cancelled by trigger (1) to preserve data integrity     [java] Cannot delete PRIMARY KEY being used in FOREIGN KEY definition..  For more information, use the --logLevel flag)     [java] Oct 13, 2009 4:41:00 PM liquibase.commandline.Main main     [java] SEVERE: GDS Exception. 335544351. unsuccessful metadata update     [java] ERASE RDB$RELATION_CONSTRAINTS failed     [java] action cancelled by trigger (1) to preserve data integrity     [java] Cannot delete PRIMARY KEY being used in FOREIGN KEY definition.     [java] liquibase.exception.JDBCException: Error executing SQL DROP TABLE NETWORK_ADAPTER     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:55)     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:86)     [java]      at liquibase.database.AbstractDatabase.dropDatabaseObjects(AbstractDatabase.java:846)     [java]      at liquibase.Liquibase.dropAll(Liquibase.java:449)     [java]      at liquibase.Liquibase.dropAll(Liquibase.java:436)     [java]      at liquibase.commandline.Main.doMigration(Main.java:613)     [java]      at liquibase.commandline.Main.main(Main.java:97)     [java]      at com....     [java] Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544351. unsuccessful metadata update     [java] ERASE RDB$RELATION_CONSTRAINTS failed     [java] action cancelled by trigger (1) to preserve data integrity     [java] Cannot delete PRIMARY KEY being used in FOREIGN KEY definition.     [java]      at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:586)     [java]      at liquibase.database.template.JdbcTemplate$1ExecuteStatementCallback.doInStatement(JdbcTemplate.java:78)     [java]      at liquibase.database.template.JdbcTemplate.execute(JdbcTemplate.java:48)     [java]      ... 9 more

It tends to fail on some machines very regularly and on others almost never.  I can make it fail if I use FlameRobin and have it connected to the database when I try dropAll; however, it also fails when nothing is connected to the database.

I Googled a bit, but didn’t come up with much.  The only lead I actually have is that it could have something to do with improper use of transactions.

  • Is anyone else using Firebird/Liquibase?
  • If so, is anyone seeing similar behavior?
  • Does anyone have any ideas for fixing this?

Thanks,
  Jamie

I haven’t used firebird at all, the firebird support was contributed.  I am working to get an install going for me to run our integration tests against, but have not gotten it yet. 

I haven’t seen anything similar on other databases before, so it is probably firebird specific.  We do start and stop transactions on a regular basis.  I don’t know exactly when during a dropAll off hand.

Nathan

I have used Firebird 1.5 together with Liquibase for a long time, but never with dropAll. I have seen, however, in other types of situations, errors like these ones you reported (“Object XXX is in use” and “PRIMARY KEY being used in FOREIGN KEY definition”). They usually occur when dealing with DDL. Maybe it is a good idea to check also a Firebird specific forum. If I remember something else, I let you know… Cheers