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, если вы хотите только создать базу данных. Необходимо проверить две вещи:
- Какие значения вы определяете во время выполнения для свойств "[DATABASE_NAME]" и "[DATABASE_SERVER]"?
- Какой пользователь и какой метод аутентификации следует использовать для входа в базу данных?
Если вы не укажете параметр '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" />