2011-03-03 102 views
4

在2.0中添加了一個非常好的方式,稱爲LiquiBased格式化SQL。有關信息,請參閱此鏈接http://blog.liquibase.org/2010/05/liquibase-formatted-sql.htmlLiquibase 2.0 - 回滾LiquiBase格式化SQL

當我嘗試添加一個回滾命令到我的腳本,在我的情況下是刪除創建的視圖LiquiBase拋出一個錯誤。這是我的腳本。

--liquibase formatted sql 

--changeset PeterPan:REQ111111 
CREATE VIEW all_employees AS 
SELECT * 
FROM employee; 


--rollback 
DROP VIEW all_employees; 
--rollback 

我也試過這也

--liquibase formatted sql 

--changeset PeterPan:REQ111111 
CREATE VIEW all_employees AS 
SELECT * 
FROM employee; 


--rollback 
DROP VIEW all_employees; 

這裏是我的命令行輸入和輸出我得到。注意我做了更新成功,然後回滾失敗。同時請記住,視圖會被丟棄,只是腳本會引發異常。如果我從構建中刪除我的視圖並運行相同的命令,則更新和回滾都會成功完成。

C:\>liquibase --driver=org.postgresql.Driver --classpath="C:/Program Files/Java/jdk1.6.0_23/lib/postgresql-9.0-801.jdbc4.jar" --url="jdbc:postgresql:/ 
/localhost:5432/test_db_build" --changeLogFile=C:/DbSource/Common/00_main_changelog.xml --username=postgres --password=password update 
INFO 3/3/11 10:05 AM:liquibase: Successfully acquired change log lock 
INFO 3/3/11 10:05 AM:liquibase: Reading from databasechangelog 
INFO 3/3/11 10:05 AM:liquibase: Reading from databasechangelog 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/Tables/0001_CreateTableEmployee.xml::1::PeterPan ran successfully in 78ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/Tables/0002_CreateSchema-test.xml::2::PeterPan ran successfully in 15ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/Tables/0003_CreateTable-junk.xml::4::PeterPan ran successfully in 31ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/Tables/0004_CreateTable-test.fun_log.xml::4::PeterPan ran successfully in 156ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/Views/001_all_employees.sql::REQ111111::PeterPan ran successfully in 15ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/DML/0001_InsertInto-public.employee.xml::4::PeterPan ran successfully in 16ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/DML/0002_Truncate-public.employee.xml::4::PeterPan ran successfully in 282ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/DML/0003_InsertInto-public.employee.xml::7::PeterPan ran successfully in 16ms 
INFO 3/3/11 10:05 AM:liquibase: ChangeSet C:/DbSource/DML/0004_InsertInto-public.employee.xml::7::PeterPan ran successfully in 33298ms 
INFO 3/3/11 10:05 AM:liquibase: Successfully released change log lock 
Liquibase Update Successful 

C:\>liquibase --driver=org.postgresql.Driver --classpath="C:/Program Files/Java/jdk1.6.0_23/lib/postgresql-9.0-801.jdbc4.jar" --url="jdbc:postgresql:/ 
/localhost:5432/test_db_build" --changeLogFile=C:/DbSource/Common/00_main_changelog.xml --username=postgres --password=password rollbackCount 10 
INFO 3/3/11 10:05 AM:liquibase: Successfully acquired change log lock 
INFO 3/3/11 10:05 AM:liquibase: Reading from databasechangelog 
INFO 3/3/11 10:05 AM:liquibase: Rolling Back Changeset:C:/DbSource/DML/0004_InsertInto-public.employee.xml::7::PeterPan::(Checksum: 3:a4b6d9d43a4175f753 
f7c0a457d1ced1) 
INFO 3/3/11 10:05 AM:liquibase: Rolling Back Changeset:C:/DbSource/DML/0003_InsertInto-public.employee.xml::7::PeterPan::(Checksum: 3:d7308afe0c1d4c8350 
6a1ffed71a226c) 
INFO 3/3/11 10:05 AM:liquibase: Rolling Back Changeset:C:/DbSource/DML/0002_Truncate-public.employee.xml::4::PeterPan::(Checksum: 3:0da476ec239364e44dda 
d4f6f6da4321) 
INFO 3/3/11 10:05 AM:liquibase: Rolling Back Changeset:C:/DbSource/DML/0001_InsertInto-public.employee.xml::4::PeterPan::(Checksum: 3:afdb713d4f13832efd 
f0a0313ead4b84) 
INFO 3/3/11 10:05 AM:liquibase: Rolling Back Changeset:C:/DbSource/Views/001_all_employees.sql::REQ111111::PeterPan::(Checksum: 3:3aee7ee7499252540b394 
acb470a1ae1) 
INFO 3/3/11 10:05 AM:liquibase: Successfully released change log lock 
Liquibase Update Failed: No inverse to liquibase.change.core.RawSQLChange created 
SEVERE 3/3/11 10:05 AM:liquibase: No inverse to liquibase.change.core.RawSQLChange created 
liquibase.exception.RollbackFailedException: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created 

     at liquibase.changelog.ChangeSet.rollback(ChangeSet.java:401) 
     at liquibase.changelog.visitor.RollbackVisitor.visit(RollbackVisitor.java:23) 
     at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:58) 
     at liquibase.Liquibase.rollback(Liquibase.java:250) 
     at liquibase.integration.commandline.Main.doMigration(Main.java:710) 
     at liquibase.integration.commandline.Main.main(Main.java:116) 
Caused by: liquibase.exception.RollbackImpossibleException: No inverse to liquibase.change.core.RawSQLChange created 
     at liquibase.change.AbstractChange.generateRollbackStatementsFromInverse(AbstractChange.java:145) 
     at liquibase.change.AbstractChange.generateRollbackStatements(AbstractChange.java:115) 
     at liquibase.database.AbstractDatabase.executeRollbackStatements(AbstractDatabase.java:1029) 
     at liquibase.changelog.ChangeSet.rollback(ChangeSet.java:388) 
     ... 5 more 


For more information, use the --logLevel flag) 

C:\> 

回答

6

好了,所以它出現在鏈路上提供我的關鍵,解決這個問題得到了這個 「-rollback添加到表示回滾SQL行的開頭」。

所以,如果我更新上面給我的腳本可以在本

--rollback DROP VIEW all_employees; 

OR這種格式也可以工作。

--rollback DROP 
--rollback VIEW all_employees; 

很高興有開始評論和結束允許這種類型的條目。 也許就像

--StartRollback 
DROP TABLE employee; 
DROP TABLE pants; 
--End Rollback 

這裏是一個網站,幫助澄清了很多本。 http://forum.liquibase.org/#topic/49382000000028385

+7

似乎每行都有註釋是一個功能,它仍允許您在LiquiBase之外運行腳本,而不必每次都執行回滾SQL。 – Kuberchaun 2011-03-04 14:41:42