10

多数の SQL シーケンスを含む Visual Studio データベース プロジェクト (DACPAC) があります。ただし、DACPAC を展開すると、常にシーケンス値が Create スクリプトに含まれる既定値 (この場合は 1) にリセットされます。例えば

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

シーケンス開始値を無視するように DACPAC に指示する方法、または展開後のステップとして DACPAC に正しい値を復元させる方法を誰かが提案できますか?

前もって感謝します

4

2 に答える 2

12

これは、SSDT ツールを使用する場合のシーケンスに関する既知の問題です。いくつかの解決策があります。

  1. パブリッシュ時にシーケンス オブジェクトを無視します。
  2. カスタム展開フィルターを使用して、開始値を無視します。
  3. ライブにデプロイした後にカウンターをインクリメントする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 に答える