使用 SqlPackage 导入 bacpac 数据库,检查存在并指定位置

Posted

技术标签:

【中文标题】使用 SqlPackage 导入 bacpac 数据库,检查存在并指定位置【英文标题】:Import bacpac database with SqlPackage, check exist and specify location 【发布时间】:2017-10-30 18:26:15 【问题描述】:

我可以运行SqlPackage来导入bacpac,这样可以在运行前检查数据库是否存在,还可以指定.mdf, .ldf文件的放置位置?所以当数据库存在时,它不会做任何事情;但是如果它不存在,它会为我导入数据库吗?

【问题讨论】:

我认为你必须结合 T-SQL 和 sqlpackage.exe 来实现这一点。用于 sqlpackage.exe 的 xp_cmdshell。 @DeanSavović 我试过你的解决方案,它奏效了,谢谢 :) 【参考方案1】:

SqlPackage.exe 不接受为导入操作指定 mdf 和 ldf 文件位置的参数。

有几个选项可以解决这个问题:

自己创建一个包含所需 mdf 和 ldf 文件的空数据库(例如使用 sqlcmd),然后运行 ​​SqlPackage.exe 将 bacpac 文件导入到空数据库中。 使用“部署贡献者”在运行时修改部署行为。这有点复杂,因为它涉及将一些 C# 代码编译成 .NET dll,然后在执行导入操作时必须使用该 dll。但好的部分是您可以根据需要重写 SqlPackage.exe 执行的 T-SQL。这是一个修改数据和日志文件路径的示例部署贡献者:https://github.com/Microsoft/DACExtensions/blob/master/Samples/Contributors/DbLocationModifier.cs

至于exists vs doesn't exist的不同行为——注意import命令会拒绝修改非空数据库,所以不管数据库是否已经存在,执行import操作都是安全的。

【讨论】:

我尝试了您对我的 Advanced Installer 项目的建议,它成功了,谢谢

以上是关于使用 SqlPackage 导入 bacpac 数据库,检查存在并指定位置的主要内容,如果未能解决你的问题,请参考以下文章

数据库导入.bacpac 文件创建新实例

无法将 SQL Azure bacpac 导入 2016 CTP

尝试将 BACPAC 从 blob 存储导入到 ssms 时收到 CREATE USER 错误

将 Azure bacpac 文件导入本地数据库时出错,在 EXTERNAL 附近出现错误语法

Azure SQL 数据库 Bacpac 本地还原

在 Azure 中创建加密的 bacpac 文件