【问题标题】:Can I deploy different versions of a table via SqlPackage and DacFx?我可以通过 SqlPackage 和 DacFx 部署不同版本的表吗?
【发布时间】:2021-05-08 16:41:40
【问题描述】:

是否可以排除或包含与要使用 dacfx 从 dacpac 部署的临时表有关的部分表?

例如,如果我的数据库项目有以下表格-

CREATE TABLE [dbo].[Table_1] (
    [Id]              INT                                         IDENTITY (1, 1) NOT NULL,
    [FirstName]       VARCHAR (256)                               NULL,
    [LastName]        VARCHAR (256)                               NULL,
    [IsActive]        BIT                                         DEFAULT (0) NOT NULL,
    [RowVersionBegin] DATETIME2 (7) GENERATED ALWAYS AS ROW START DEFAULT (sysutcdatetime()) NOT NULL,
    [RowVersionEnd]   DATETIME2 (7) GENERATED ALWAYS AS ROW END   DEFAULT (CONVERT([datetime2],'9999-12-31 23:59:59.9999999')) NOT NULL,
    CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ([Id] ASC),
    PERIOD FOR SYSTEM_TIME ([RowVersionBegin], [RowVersionEnd])
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[dbo].[Table_1__TemporalHistory], DATA_CONSISTENCY_CHECK=ON, HISTORY_RETENTION_PERIOD=12 DAY));
GO

CREATE TABLE [dbo].[Table_1__TemporalHistory] (
    [Id]              INT           NOT NULL,
    [FirstName]       VARCHAR (256) NULL,
    [LastName]        VARCHAR (256) NULL,
    [IsActive]        BIT           NOT NULL,
    [RowVersionBegin] DATETIME2 (7) NOT NULL,
    [RowVersionEnd]   DATETIME2 (7) NOT NULL
);
GO
CREATE CLUSTERED INDEX [ix_Table_1__TemporalHistory]
    ON [dbo].[Table_1__TemporalHistory]([RowVersionEnd] ASC, [RowVersionBegin] ASC);

在我的 SQL Server 实例上,我有 Database1、Database2、3、4...20。 我可以在部署时使用 DacFX 排除 Table_1__TemporalHistory 以及排除为 Table_1 部署的以下项目,除非数据库配置为接收它们?配置是另一个数据库表中的数据库列表,其中包含 Temporal 的 True 或 False 标志。

RowVersionBegin
RowVersionEnd
PERIOD FOR SYSTEM_TIME(RowVersionBegin, RowVersionEnd)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[dbo].[Table_1__TemporalHistory], DATA_CONSISTENCY_CHECK=ON, HISTORY_RETENTION_PERIOD=12 DAY))

【问题讨论】:

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


    【解决方案1】:

    这并不完全符合您的要求,但这是可行的。由于 SSDT 项目只是一组文件和结构正确的 .sqlproj 文件,实际上是 XML,因此您可以通过一些脚本生成整个项目,因此它将简单地获取原始项目并为时态表添加所需的修改。这甚至可以添加为构建贡献者,并将在主项目的每个构建中执行。

    我尝试实现类似的场景(不完全使用临时表,但主要思想是相同的),但是我无法实现。那是很久以前的事了,所以我记得唯一可能你可以从“外部”控制的是部署配置,然后你还需要使用Build IncludeBuild None 两次添加相同的文件,否则在那里是不能同时在两个项目中工作的东西,也许文件引用也存在一些问题。

    我个人会生成第二个项目。为了让生活更轻松,我会这样做:

    • 从头开始创建新项目
    • 在某处创建 sqlproj 文件的副本,可以在同一文件夹中 (sqlproj_tmpl)
    • 将 %%%%%%PLACEHOLDER%%%%%% 或任何其他字符串添加到sqlproj_tmpl(示例如下)
    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <OutputPath>bin\Debug\</OutputPath>
        <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>
        <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <DefineDebug>true</DefineDebug>
        <DefineTrace>true</DefineTrace>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <PropertyGroup>
        <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
        <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
        <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
        <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
      </PropertyGroup>
      <Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
      <Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
      <ItemGroup>
        <Folder Include="Schemas" />
        <Folder Include="Schemas\dbo" />
        <Folder Include="Schemas\dbo\Tables" />
      </ItemGroup>
      
      <ItemGroup>
      %%%%%%PLACEHOLDER%%%%%%
      </ItemGroup>
    </Project>
    
    
    • 在主要项目中添加类似
    /* 
    %%%%%%REPLACE_START%%%%%%
    -- put all needed additional DDL instructions you want to add in the temporal table
    %%%%%%REPLACE_END%%%%%%
    */
    
    • 创建一个脚本,该脚本将从主项目中获取所有需要的表并正确替换文本
    • 如果需要,您可以使用构建贡献功能在每个项目构建上运行此脚本(您可以将此脚本作为主项目的构建贡献者包含在内)

    【讨论】:

    • Dmitrij,我已经开始着手编辑 .sqlproj 并拥有两个版本的 Table_1。 .sqlproj 现在具有以下元素: false
    • 现在我只需要弄清楚如何在 IsTemporal=true 和 IsTemporal=false 之间切换以获得 Table_1 的非临时版本与 Table_1 的临时版本,并且它随附的历史表在解决方案探索者。您是否有在两种配置之间来回切换以及根据所选配置使一个或多个对象的不同版本可见或不可见的经验?
    • 另外,我将如何进行构建以生成单独的文件(1 个带有临时文件,另一个没有临时文件)?或者我是否只使用 IsTemporal=true 构建一次,复制到不同的文件夹。然后用 IsTemporal=false 重新构建?
    • 我不明白你要我做什么。使用构建贡献功能的脚本会是什么?如何让我在解决方案中在有或没有时态表的版本之间来回切换?
    • 您将拥有 2 个不同的项目。 1 用于非临时表,另一个用于临时表。唯一的区别是第二个会自动生成,所以你不需要维护它
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2017-11-06
    • 2021-11-16
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多