10

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

CREATE SEQUENCE [dbo].[MySequence]
AS INT
START WITH 1
INCREMENT BY 1;

谁能建议一种方法来指示 DACPAC 忽略序列起始值,或者让 DACPAC 恢复正确值作为部署后步骤的某种方法?

提前致谢

4

2 回答 2

12

这是使用 SSDT 工具时序列的一个已知问题。有几个解决方案。

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

1.发布时忽略序列对象

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

<ExcludeSequences>True</ExcludeSequences>

或者,从命令行

/p:ExcludeObjectType=Sequences

2.使用自定义部署过滤器

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

<AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
<AdditionalDeploymentContributorArguments>SqlPackageFilter=IgnoreName(Order_No_Seq)</AdditionalDeploymentContributorArguments>

或者,从命令行:

/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreName(Order_No_Seq)"

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;

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


资源

于 2015-12-01T12:19:01.370 回答
1

有点晚了,但我也有这个问题。引起很多人的头疼。

我已经向微软提出了一张票:https ://developercommunity.visualstudio.com/content/problem/732407/dacpac-resets-sequences.html

我们当前的解决方法是使用部署前和部署后脚本在应用 dacpac 之前捕获所有序列值,然后再将它们重置回来。

这远非理想。

于 2019-09-12T08:10:29.947 回答