2016-11-25 5 views
0

現在、テーブルがあります。Messagesです。 ID列は主キーであり、IDを使用して設定されます。プライマリキーIDを次のAUTO_INCREMENT値で始まるシーケンスに置き換えます。

x-----------------------------x 
| ID  | Contents  | 
x-------------|---------------x 
| 1  || 
| 2  | 56789  | 
x-----------------------------x 

私はID列にIDを削除し、Messages_ID_Sequence、シーケンスからIDのデフォルト値を取り込むことで、それを交換したいです。

これはSSDTで達成するのは簡単です。しかし、私は、データベースプロジェクトを展開するときに、Messages_ID_Sequenceの最初の値が、私はMessages_ID_Sequenceのために生成されたSQLを見たときに、なぜそれは明らかだ1です:私は、新しいメッセージレコードを挿入しようとすると、

CREATE SEQUENCE [dbo].[CommandMsgs_MSGID_Sequence] 
    AS BIGINT 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10 

問題が起こります。シーケンス1の最初の値は、新しいレコードのID列に値を設定し、主キー制約に違反します。

したがって、Messages_ID_Sequenceが作成されたときに、そのID番号が提供された次のIDで始まるようにするにはどうすればよいですか? Messages_ID_Sequenceの作成スクリプトのビルドアクションは、ビルドに設定する必要があります。そのため、SSDTが理解できないものはソリューションに含まれません。

答えて

1

シーケンスを作成するためにSQL文をdinamically構築することができます。したがって、最後のIDで開始します。

/* Read the last identity value */ 
DECLARE @value bigint; 
select @value = max(id_field) from my_table; 

/* Create the sequence starting at that value */ 
DECLARE @sql nvarchar(max); 
SET @sql = N'CREATE SEQUENCE [dbo].[CommandMsgs_MSGID_Sequence] AS BIGINT START WITH ' + cast(@value as nvarchar(20)) + ' INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 10;'; 
EXEC SP_EXECUTESQL @sql; 

シーケンスをいつでも更新して、希望の値で開始するようにしてください。

/* Read the last identity value */ 
DECLARE @value bigint; 
select @value = max(id_field) from my_table; 

/* Create the sequence starting at that value */ 
DECLARE @sql nvarchar(max); 
SET @sql = N'ALTER SEQUENCE StreamEntrySequence RESTART WITH ' + cast(@value as nvarchar(20)) + ';'; 
EXEC SP_EXECUTESQL @sql; 
+0

いつ実行すればよいですか?デプロイメント後のスクリプトとして?デプロイ後のスクリプトに追加された場合、データベースを公開するたびに実行されます。それは必ずしも有害ではないように見えますが、環境ごとに1回だけ行う必要があることを考えると無駄です。 –

+0

シーケンスの作成直後に、展開スクリプトで実行することができます。 –

+0

答えを更新したので、シーケンスを直接作成するので、データベースを更新するときに一度だけ呼び出す必要があります。 –

関連する問題