DACPAC 和 SQL 序列
DACPAC and SQL Sequence
我有一个 Visual Studio 数据库项目 (DACPAC),其中包含许多 SQL 序列。但是,当我部署 DACPAC 时,它总是将序列值重置为创建脚本中包含的默认值(在本例中为 1)。例如
CREATE SEQUENCE [dbo].[MySequence]
AS INT
START WITH 1
INCREMENT BY 1;
任何人都可以建议一种方法来指示 DACPAC 忽略序列起始值,或者某种方法让 DACPAC 恢复正确的值作为 post 部署步骤吗?
提前致谢
这是使用 SSDT 工具时序列的一个已知问题。有几个解决方案。
- 发布时忽略序列对象。
- 使用自定义部署过滤器忽略起始值。
- 部署到实时后,使用
sp_sequence_get_range
而不是 RESTART WITH
来增加计数器。
1。发布时忽略序列对象
这是最简单的选项,但也是最尴尬的,因为这意味着您必须手动部署序列。
将以下内容添加到您的发布配置文件
<ExcludeSequences>True</ExcludeSequences>
或者,从命令行
/p:ExcludeObjectType=Sequences
2。使用自定义部署过滤器
首先下载AgileSqlClub's部署过滤器。
然后将以下内容添加到您的部署配置文件中:
<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;
这样,起始值将始终与部署脚本中的预期值相匹配。
资源
- Connect issue - 这个link死了
- Forum post discussing the issue
- MSDN for sp_sequence_get_range
- User Voice/Azure Feedback issue - 替换连接问题 - 标记为已计划 2018-03-16
有点晚了,但我也遇到过这个问题。很头疼。
我已经向 Microsoft 提交了工单:https://developercommunity.visualstudio.com/content/problem/732407/dacpac-resets-sequences.html
我们当前的解决方法是使用预部署脚本和 post 部署脚本在应用 dacpac 之前捕获所有序列值,然后在之后将它们重置。
这远非理想。
我有一个 Visual Studio 数据库项目 (DACPAC),其中包含许多 SQL 序列。但是,当我部署 DACPAC 时,它总是将序列值重置为创建脚本中包含的默认值(在本例中为 1)。例如
CREATE SEQUENCE [dbo].[MySequence]
AS INT
START WITH 1
INCREMENT BY 1;
任何人都可以建议一种方法来指示 DACPAC 忽略序列起始值,或者某种方法让 DACPAC 恢复正确的值作为 post 部署步骤吗?
提前致谢
这是使用 SSDT 工具时序列的一个已知问题。有几个解决方案。
- 发布时忽略序列对象。
- 使用自定义部署过滤器忽略起始值。
- 部署到实时后,使用
sp_sequence_get_range
而不是RESTART WITH
来增加计数器。
1。发布时忽略序列对象
这是最简单的选项,但也是最尴尬的,因为这意味着您必须手动部署序列。 将以下内容添加到您的发布配置文件
<ExcludeSequences>True</ExcludeSequences>
或者,从命令行
/p:ExcludeObjectType=Sequences
2。使用自定义部署过滤器
首先下载AgileSqlClub's部署过滤器。 然后将以下内容添加到您的部署配置文件中:
<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;
这样,起始值将始终与部署脚本中的预期值相匹配。
资源
- Connect issue - 这个link死了
- Forum post discussing the issue
- MSDN for sp_sequence_get_range
- User Voice/Azure Feedback issue - 替换连接问题 - 标记为已计划 2018-03-16
有点晚了,但我也遇到过这个问题。很头疼。
我已经向 Microsoft 提交了工单:https://developercommunity.visualstudio.com/content/problem/732407/dacpac-resets-sequences.html
我们当前的解决方法是使用预部署脚本和 post 部署脚本在应用 dacpac 之前捕获所有序列值,然后在之后将它们重置。
这远非理想。