我们使用Fluent Migrator在我们的WPF应用程序中迁移SQL Server数据库。现在我正在使用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操作在迁移开始之前就已经完成,是否有人知道为什么会发生这种情况或如何解决它?
答案 0 :(得分:0)
您的示例似乎缺少sql:SqlScript元素的BinaryKey属性?
这是我写的一个工作脚本的摘录。
首先,定义要运行的脚本。 (即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元素。我已经包含在这里,以防万一。
答案 1 :(得分:0)
当您只想创建数据库时,不需要其他SQL脚本。有两件事要检查:
如果您未在SqlDatabase中指定'user'-param,则将自动获取当前登录用户及其Windows身份验证。如果您不想这样做,则必须自己定义“用户”。
此示例采用本地安装的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" />