2016-04-27 5 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

Вы не можете восстановить базу данных, к которой вы подключены. Вам нужно изменить URL-адрес JDBC на **, а не ** включить имя базы данных –

+0

@a_horse_with_no_name, и как применить остальные изменения к моему «CleanDB»? – Dewfy

+1

Вы можете попробовать добавить «USE master; GO;» как первая строка. Просто догадка. – SteveDonie

ответ

0

Благодаря @SteveDonie комментарий я нашел решение, которое основывает на 4 этапа:

  1. Переключение в другую базу данных (например, мастер)

  2. использования Высвобождение CleanDB;

  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 вы можете указать его по командной строке liquebase '-DdatabaseName = YourDBName' – Dewfy

Смежные вопросы