Wix, создай базу данных и запусти миграцию

Мы используем Fluent Migrator для переноса базы данных SQL Server в наше WPF-приложение. Сейчас я делаю установщик с Wix Toolset и пытаюсь добавить миграцию как часть установки.

У меня есть пользовательское действие, которое выполняет миграцию, и компонент с тегом SqlDatabase, который создает базу данных. Миграция работает хорошо, если я указываю на существующую базу данных во время установки, и создание базы данных работает хорошо, если я выбираю несуществующую базу данных. Но, запустив их вместе, я получаю ошибку SQL Server.

*Cannot open database "Database" requested by the login. The login failed.
Login failed for user 'User'.!*

Ошибка возникает при создании MigrationRunner:

new MigrationRunner(migrationsAssembly, migrationContext, processor);

База данных SqlDatabase выглядит следующим образом:

<sql:SqlDatabase Id='SqlDatabase.IntegratedAuthentication' 
    Database='[DATABASE_NAME]' 
    Server='[DATABASE_SERVER]' 
    CreateOnInstall='yes' 
    DropOnUninstall='no' 
    ContinueOnError='no' />

В своем журнале я вижу, что действие CreateDatabase завершено до начала миграции, кто-нибудь знает, почему это происходит или как обойти это?

1 ответ

В вашем примере, кажется, отсутствует атрибут BinaryKey для элемента sql:SqlScript?

Вот выдержка из рабочего сценария, который я написал.

Сначала вы определяете сценарии, которые хотите запустить. (т.е. значения для атрибута BinaryKey)

<Binary Id="CreateTablesBin" SourceFile="Database\[CreateScript]"></Binary>
<Binary Id="FillTablesBin" SourceFile="Database\[DataScript]"></Binary>
<Binary Id="DropTablesBin" SourceFile="Database\[RollbackScript]"></Binary>

А затем вы определяете функцию для запуска сценариев БД.

<Feature Id="ProductFeature" Title="DB Server Setup" Level="1">
  <ComponentGroupRef Id="MyWebComponents"/>
  <ComponentGroupRef Id="IISConfiguration"/>
  <Component Id="IntegratedSecurity" Guid="[GUID Here]" Directory="INSTALLFOLDER">
    <sql:SqlDatabase Id="MySqlDatabase" Database="[DATABASE_NAME]" Server="[DATABASE_SERVER]" CreateOnInstall="yes" DropOnUninstall="yes" ContinueOnError="yes"> <!-- Don't specify user for Integrated Authentication / Win Authentication -->
      <sql:SqlScript Id="CreateTables" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="CreateTablesBin" ContinueOnError="no" />
      <sql:SqlScript Id="FillTables" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="FillTablesBin"  ContinueOnError="no"/>
      <sql:SqlScript Id="DropTables" ExecuteOnInstall="no" ExecuteOnUninstall="yes" BinaryKey="DropTablesBin"  ContinueOnError="yes"/>
    </sql:SqlDatabase>
    <CreateFolder/>
  </Component>     
</Feature>

Я не уверен, если вам нужно 2 элемента ComponentGroupRef там. Я включил сюда на случай, если это необходимо.

Вам не нужен дополнительный сценарий SQL, если вы хотите только создать базу данных. Необходимо проверить две вещи:

  1. Какие значения вы определяете во время выполнения для свойств "[DATABASE_NAME]" и "[DATABASE_SERVER]"?
  2. Какой пользователь и какой метод аутентификации следует использовать для входа в базу данных?

Если вы не укажете параметр 'user' внутри SqlDatabase, автоматически будет выбран текущий зарегистрированный пользователь с его Windows Authentifaction. Если вы этого не хотите, вам нужно определить "пользователя" самостоятельно.

В этом примере используются локально установленный сервер SQL Express и текущий пользователь Win:

<Property Id="SQLINSTANCE" Value="SQLEXPRESS" />
<Property Id="SQLSERVER" Value="LOCALHOST" />
...
<sql:SqlDatabase Id="SqlDatabase" Database="Foobar" Server="[SQLSERVER]" Instance="[SQLINSTANCE]" CreateOnInstall="yes" DropOnUninstall="yes" />
Другие вопросы по тегам