SqlPackage.exe忽略其CreateNewDatabase属性?

时间:2014-03-04 20:30:02

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

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

  • 第一个项目负责目标数据库本身。
  • 第二个项目具有对第一个项目的数据库引用,并负责目标数据库中的测试数据。

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

要部署第二个项目,我尝试按如下方式使用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"表示我在DROP DATABASE中找不到CREATE DATABASEBlahTest.sql;但无论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输出不删除/创建目标数据库的脚本?

1 个答案:

答案 0 :(得分:1)

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

使用SqlPackage.exe无法实现您想要的功能,但编写自己的代码非常容易。有关数据库是否存在,请参阅this answer on how to check if a database exists以获取示例代码检查。如果CheckDatabaseExists为true,您可以编写执行此检查的powershell脚本并调用SqlPackage.exe。