【问题标题】:SqlPackage.exe ignores its CreateNewDatabase property?SqlPackage.exe 忽略其 CreateNewDatabase 属性?
【发布时间】:2014-03-04 20:30:02
【问题描述】:

在 VS 2013 中,有两个针对同一数据库的 SSDT 复合项目:

  • 第一个项目负责目标数据库本身。
  • 2nd project有1st project的数据库引用,负责目标数据库中的测试数据。

当我部署第二个项目时,我想根据需要更新目标数据库,从不删除/创建它。

为了部署第二个项目,我尝试使用SqlPackage.exe 如下生成部署脚本:

C:\some\directory\ssdt\sqlpackage.exe ^
    /a:Script ^
    /op:".\BlahTest.sql" ^
    /sf:".\BlahTest.dacpac" ^
    /tsn:"localhost" ^
    /tdn:"BlahTest" ^
    /p:CreateNewDatabase="False" ^
    REM ...

我预计/p:CreateNewDatabase="False" 意味着我不会在BlahTest.sql 中找到DROP DATABASECREATE DATABASE;但无论CreateNewDatabase 属性如何(即设置为"False"、设置为"True" 或省略),我都会看到以下内容:

USE [master];


GO

IF (DB_ID(N'$(DatabaseName)') IS NOT NULL) 
BEGIN
    ALTER DATABASE [$(DatabaseName)]
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [$(DatabaseName)];
END

GO
PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)]
    ON 
    PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
    LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS
GO

如何让SqlPackage.exe 输出不删除/创建目标数据库的脚本?

【问题讨论】:

  • 您可以在发布配置文件中执行此操作吗?我将我的一个配置文件设置为始终创建数据库(“新”配置文件),而所有其他配置文件都设置为不这样做。我没有经常使用直接命令行,但想知道您是否需要双引号来表示“False”才能使其工作。
  • @PeterSchott:好问题。是的,当我使用 VS 项目中的配置文件发布时,我能够(不)根据需要删除/创建 - 只是不在 SqlPackage.exe 第二个项目的脚本输出中。

标签: deployment visual-studio-2013 sql-server-data-tools


【解决方案1】:

CreateNewDatabase 标志只是确定在发布时是否总是进行完全删除和重新创建 - 也许SqlPackage.exe 文档对此还不够清楚?它声明 CreateNewDatabase “指定是否应该更新目标数据库,或者在发布到数据库时是否应该删除并重新创建它。”假设是,如果您选择发布,无论如何您都希望创建数据库。

你不能只使用 SqlPackage.exe 来做你想做的事,但是编写你自己的代码来做这件事会很容易。有关检查数据库是否存在的示例代码,请参阅this answer on how to check if a database exists。如果 CheckDatabaseExists 为真,您可以编写一个执行此检查并调用 SqlPackage.exe 的 powershell 脚本。

【讨论】:

  • 有趣。因此,/p:CreateNewDatabase 似乎与 /a:Script 毫无意义。感谢您强调这一微妙之处,但该选项不适用于/a:Script,真是太可惜了。
  • 您绝对可以使用带有发布配置文件的 SQLPackage 来避免这种情况。您可能无法使用直接的命令行来执行此操作,但发布配置文件允许您生成一个不会尝试删除/重新创建数据库的脚本。如果您经常使用相同的选项和连接,我可能会考虑创建一个配置文件。
  • @KevinCunnane:我收回了这一点。 SqlPackage.exe 的文档将 /p:CreateNewDatabase 列为 /a:Publish /a:Script 的属性。
  • @PeterSchott:直觉很好。 SqlPackage.exe 的文档没有将 /Profile: { string }(或 /pr: { string })列为 /a:Script 的参数 - 仅适用于 /a:Publish。事实上,它的文档很清楚/a:Script 的唯一有效参数是/OutputPath: { string }(或/op: { string })。不过奇怪的是,/pr: { string }确实影响了SqlPackage.exe /a:Script 的行为——例如,就像使用指定的发布配置文件在 VS 中生成脚本一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2018-12-11
  • 2023-03-19
  • 2011-04-13
相关资源
最近更新 更多