I have a Visual Studio database project (DACPAC) which includes a number of SQL Sequences. However when I deploy the DACPAC it always resets the sequence value to the default value included in the Create script (in this case 1). e.g.
CREATE SEQUENCE [dbo].[MySequence]
AS INT
START WITH 1
INCREMENT BY 1;
Can anyone suggest a way of either instructing the DACPAC to ignore the sequence start value, or some way of getting the DACPAC to restore the correct value as a post deployment step perhaps?
Thanks in advance
This is a known problem with sequences when using the SSDT tools. There are a couple of solutions.
sp_sequence_get_range
instead of RESTART WITH
to increment the counter after deploying to live.This is the simplest option but the most awkward as it means you have to manually deploy sequences. Add the following to your publish profile
<ExcludeSequences>True</ExcludeSequences>
Or, from the command line
/p:ExcludeObjectType=Sequences
First download AgileSqlClub's deployment filter. Then add the following to your deployment profile:
<AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
<AdditionalDeploymentContributorArguments>SqlPackageFilter=IgnoreName(Order_No_Seq)</AdditionalDeploymentContributorArguments>
Or, from the command line:
/p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor
/p:AdditionalDeploymentContributorArguments="SqlPackageFilter=IgnoreName(Order_No_Seq)"
sp_sequence_get_range
For this instead of using RESTART WITH
on the production server to change the start value, use:
DECLARE @range_first_value SQL_VARIANT;
EXEC sp_sequence_get_range
@sequence_name = 'MySequence',
@range_size = 1000,
@range_first_value = @range_first_value OUTPUT;
This way the start value will always match the expected value from the deployment script.