【问题标题】:Customizing deployments of a SQL Server Data Tools (SSDT) package using sqlpackage.exe to vary per environment使用 sqlpackage.exe 自定义 SQL Server Data Tools (SSDT) 包的部署,以因环境而异
【发布时间】:2019-08-20 04:45:42
【问题描述】:

我有一个 SQL Server Data Tools (SSDT) .sqlproj 文件,其中包含如下表类型:

CREATE TYPE [dbo].[tableType] AS TABLE
(
    [id] uniqueidentifier INDEX [idx],
)
 WITH  
        (MEMORY_OPTIMIZED = ON); 

我正在将此项目部署到 Azure SQL。问题是我的测试数据库是 Azure SQL 标准(而不是高级或关键业务)。因此,它们不支持内存优化表。所以我想弄清楚的是一种在测试中不进行内存优化而在生产中进行内存优化的部署类型的方法。命令行开关,环境变量,任何工作。我正在使用 sqlpackage.exe 进行部署,但我愿意接受其他方法来实现这一点。

【问题讨论】:

    标签: sql-server sql-server-data-tools sqlpackage


    【解决方案1】:

    我会试试 SSDT SQLCMD 变量:

    SQLCMD Variables

    在 SQL Server 数据库项目中,您可以利用 SQLCMD 变量来提供用于调试或发布的动态替换。您输入变量名称和值,在构建期间,这些值将被替换。如果没有本地值,将使用默认值。 通过在项目属性中输入这些变量,它们将自动在发布中提供并存储在发布配置文件中。您可以通过“加载值”按钮将变量的项目值拉入发布中。

    确保在项目属性中输入正确的变量,因为这些变量不会针对项目中的脚本进行验证,也不会自动填充脚本中使用的变量。

    图片来源:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/30895c7f-9a49-4fab-b3d1-b690fff82792/sqlcmd-variables-not-recognized-by-ssdt-build-fails-when-these-are-used-in-a-script

    CREATE TYPE [dbo].[tableType] AS TABLE
    (
        [id] uniqueidentifier INDEX [idx],
    ) $(param_name);
    

    在发布期间可以定义为:

    TEST - empty
    PROD -  WITH (MEMORY_OPTIMIZED = ON); 
    

    尽管我强烈建议升级测试环境。

    【讨论】:

    • 谢谢,这太完美了!我希望我可以将两个标记为答案。
    • @ErickT 没问题,请随意标记最适合您的答案:)
    【解决方案2】:

    由于这是特定于环境的,我建议您选择以下方法之一:

    你可以有三种方法:

    1. 正如@Lukasz Szozda 建议的那样,您可以使用 SQLCMD 变量。定义 SQLCMD 变量并提及环境。根据环境,您可以决定在部署后脚本中执行哪个脚本。
    IF '$(Environment)' = 'Prod'
            BEGIN
                :r .\ProdSpecificScript\Prod_TableTable.sql
            END
            ELSE
            BEGIN
               :r .\NonProdSpecificScript\NonProd_TableTable.sql
            END 
    
    1. 您可以使用以下信息更新项目文件,以根据环境使用不同的文件覆盖部署后脚本。您可以有两个不同的部署后脚本和不同的 TableType 脚本。
    <Target Name="BeforeBuild">
          <Message Text="Copy files task running for configuration: $(Configuration)" Importance="high" />
          <Copy Condition=" '$(Environment)' == 'Prod' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
          <Copy Condition=" '$(Environment)' == 'NonProd' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />      
      </Target>
    
    1. 您可以查看 Azure 服务层并据此决定脚本。
    DECLARE @ServiceTier VARCHAR(30)
    SET @ServiceTier = (SELECT COALESCE(DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective'), 'N/A in v11') AS AzureTier FROM sys.database_service_objectives
    
    IF @ServiceTier = 'P1'
    BEGIN
        :r .\ProdSpecificScript\Prod_TableTable.sql
    END
    ELSE
    BEGIN
       :r .\NonProdSpecificScript\NonProd_TableTable.sql
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多