DACPAC和SQL序列

Lee*_*eeM 8 sql-server visual-studio dacpac sqlpackage sql-server-data-tools

我有一个Visual Studio数据库项目(DACPAC),其中包含许多SQL序列.但是,当我部署DACPAC时,它总是将序列值重置为Create脚本中包含的默认值(在本例中为1).例如

CREATE SEQUENCE [dbo].[MySequence]
AS INT
START WITH 1
INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一种方法来指示DACPAC忽略序列起始值,或者某种方式让DACPAC恢复正确的值作为部署后的步骤吗?

提前致谢

Chr*_*ers 8

当使用SSDT工具时,这是序列的已知问题.有几种解决方案.

  1. 发布时忽略序列对象.
  2. 使用自定义部署筛选器忽略起始值.
  3. 在部署到live之后使用sp_sequence_get_range而不是RESTART WITH增加计数器.

1.发布时忽略序列对象

这是最简单的选项,但最尴尬,因为这意味着您必须手动部署序列.将以下内容添加到发布配置文件中

<ExcludeSequences>True</ExcludeSequences>
Run Code Online (Sandbox Code Playgroud)

或者,从命令行

/p:ExcludeObjectType=Sequences
Run Code Online (Sandbox Code Playgroud)

2.使用自定义部署筛选器

首先下载AgileSqlClub的部署过滤器.然后将以下内容添加到部署配置文件中:

<AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
<AdditionalDeploymentContributorArguments>SqlPackageFilter=IgnoreName(Order_No_Seq)</AdditionalDeploymentContributorArguments>
Run Code Online (Sandbox Code Playgroud)

或者,从命令行:

/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreName(Order_No_Seq)"
Run Code Online (Sandbox Code Playgroud)

3.使用 sp_sequence_get_range

为此而不是RESTART WITH在生产服务器上使用来更改起始值,请使用:

DECLARE @range_first_value SQL_VARIANT;
EXEC sp_sequence_get_range
    @sequence_name = 'MySequence',
    @range_size = 1000,
    @range_first_value = @range_first_value OUTPUT;
Run Code Online (Sandbox Code Playgroud)

这样,起始值将始终与部署脚本中的预期值匹配.


资源

  • 我已经有一段时间没有看到这个了,但如果我没记错的话,RESTART WITH 会更改 START 值,这会导致 DPAC 稍后重置起始值(认为它已更改)。sp_sequence_get range 只是像平常一样使用序列中的值,因此起始值保持不变。尽管您必须进行测试才能确认。 (3认同)