2016-04-27 46 views
0

を失敗した私は、複数の変更セットを適用したいのですが、最初のものは、次のように復元し、データベーススクリプトです:LiquiBaseをはMSSQLのバックアップからの復元は、LiquiBaseをを使用して

<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をスクリプトを適用する方法? @SteveDonieコメントへ

+0

。 JDBC URLを変更して**データベース名 –

+0

@a_horse_with_no_nameを含めないで**残っているものを変更する必要があります。その後、残りの変更を私の 'CleanDB'に適用する方法は? – Dewfy

+1

"USE master; GO;"を追加してみてください。最初の行として。ちょうど推測。 – SteveDonie

答えて

0

おかげで私は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の "built in"プロパティですか? –

+0

@CptS liquebase '-DdatabaseName = YourDBName'のコマンドラインで指定できます – Dewfy

関連する問題