2016-04-27 175 views
0

使用Liquibase我想申請多個變更集,但第一個是恢復的數據庫腳本如下:LIQUIBASE從MSSQL備份恢復失敗

<changeSet id="0" author="me" context="test or dev"> 
    <sql > 
     RESTORE DATABASE CleanDB 
     FROM DISK = '\\SomePublic\DevDB.bak' 
     WITH REPLACE; 
    </sql> 
</changeSet> 
<!-- here many changes go --> 

CleanDB是新的空現有的數據庫。我的連接URL指定DevDB作爲目標,並期待:url=jdbc:sqlserver://SomePublic;databaseName=CleanDB

在執行過程中我已經得到了錯誤:

liquibase: RESTORE cannot process database 'CleanDB' because it is in use by this session. It is recommended that the master database be used when performing this operation.

所以我的問題:如何申請Liquibase腳本清除數據庫應該從一些備份恢復?

+0

不能恢復到您所連接的數據庫。您需要將JDBC URL更改爲**而不是**包括數據庫名稱 –

+0

@a_horse_with_no_name太棒了,那麼如何將其餘更改應用於我的'CleanDB'? – Dewfy

+1

您可以嘗試添加「USE master; GO;」作爲第一行。只是一個猜測。 – SteveDonie

回答

0

由於@SteveDonie評論我發現,是立足於4個步驟的溶液:

  1. 切換到其它數據庫(主例如)的CleanDB

  2. 推出使用;

  3. 應用備份到CleanDB

  4. 恢復使用,並從主切換回CleanDB

所以下面的代碼工作對我來說:

<sql splitStatements="true"> 
    use master; <!-- switch to master --> 
    <!-- avoid error that CleanDB already in use --> 
    alter database ${databaseName} 
    set single_user with rollback immediate; 
    <!-- apply backup --> 
    RESTORE DATABASE CleanDB 
    FROM DISK = '\\SomePublic\DevDB.bak' 
    WITH REPLACE; 
    <!-- Restore access to database --> 
    alter database ${databaseName} 
    set multi_user; 
    <!-- switch back for further Liquibase operations --> 
    use ${databaseName}; 

</sql> 
+0

我有類似的問題。爲了解決它,我需要做一個'alter database'。但是,我收到以下錯誤消息:遷移設置失敗...失敗的SQL:ALTER DATABASE $ {databaseName} ...'。所以我的問題是:屬性'databaseName'從哪裏來?我是否必須手動指定它('')還是liquibase中的「內置」屬性? –

+0

@CptS您可以通過液晶命令行指定它'-DdatabaseName = YourDBName' – Dewfy