Последовательность DACPAC и SQL

У меня есть проект базы данных Visual Studio (DACPAC), который включает в себя несколько последовательностей SQL. Однако при развертывании DACPAC он всегда сбрасывает значение последовательности до значения по умолчанию, включенного в сценарий создания (в данном случае 1). например,

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

может ли кто-нибудь предложить способ либо инструктировать DACPAC игнорировать начальное значение последовательности, либо каким-то образом заставить DACPAC восстановить правильное значение в качестве шага после развертывания?

спасибо заранее

1 ответов


это известная проблема с последовательностями при использовании инструментов SSDT. Есть несколько решений.

  1. игнорировать объекты последовательности при публикации.
  2. используйте настраиваемый фильтр развертывания, чтобы игнорировать начальное значение.
  3. использовать sp_sequence_get_range вместо RESTART WITH для увеличения счетчика после развертывания в live.

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;

таким образом, начальное значение всегда будет соответствовать ожидаемому значению из сценария развертывания.


ресурсы