SQL Server 2012シーケンスのリセット


13

私は、SEQUENCEオブジェクトを活用する特定のテーブルをテストし、データを取り込むプロセスにいます。このプロセスでは、何万もの挿入行をテーブルに追加するテストを行っています(これをプログラムする方法に慣れていないため)。この特定のテーブルで見られる問題は、別の母集団テストを開始したときに、SEQUENCE希望する最初の数値(1)にリセットされないことです。

新しいテストを再実行する場合は、問題のテーブルを削除してから次を実行します。

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

テストを再実行する場合、次のSCHEMASEQUENCEコマンドを実行します。これらのコマンドは、以下の順序で実行されます。

CREATE SCHEMA foo;
GO

CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;

GO

次に、テーブルを作成します。

CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)

GO

それが完了したら、次の挿入コマンドを50,000回実行します。

INSERT INTO [foo].[sample_table_with_data] 
(
    [order_number],
    [sample_column_one], 
    [sample_column_two], 
    [sample_column_three]
) 
VALUES 
(
    NEXT VALUE FOR foo.fee, 
    'Blah', 
    'Blah Blah', 
    'Blah Blah Blah'
)

これで、テーブルに入力するデータにまったく問題はありません。私が直面している課題は、テーブルを削除し、スキーマとシーケンスを削除してから、テーブル、シーケンス、スキーマを再作成SEQUENCEし、以前のデータベース化の最後の番号からピックアップし、1にリセットしないことです。

たとえば、シーケンスの最後の番号が634,534である場合、新しいテーブルの次のシーケンス番号は634,535です。

テーブルを削除し、スキーマとシーケンスを削除した後、次を実行してシーケンスとスキーマが削除されたことを確認します。

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

私はこれがなぜ起こっているのか困惑しています。ここで何が起こっているのかを正確にローカライズするのに役立つ別のコマンドがここにありませんか?

このテーブルは、他の7つのテーブルがすべてSEQUENCEコマンドを正しく実行しているデータベースに属していることに注意してください。

これは、SQL 2012 SP1 Enterprise Editionのインストールです。

回答:



5

いくつかのわずかな変更を加えたスクリプトの使用:

CREATE SCHEMA foo;
GO
CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;
GO
CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)
GO
SET NOCOUNT ON
GO
INSERT INTO [foo].[sample_table_with_data]
    ([order_number],[sample_column_one],[sample_column_two],[sample_column_three]) 
VALUES
    (NEXT VALUE FOR foo.fee,'Blah','Blah Blah','Blah Blah Blah')
GO 50000
SELECT
    MIN(order_number), 
    MAX(order_number)
FROM foo.sample_table_with_data AS stwd
GO
DROP SEQUENCE foo.fee;
GO
DROP TABLE foo.sample_table_with_data
GO
DROP SCHEMA foo;

... SQL Server 2012 SP1(ビルド3000)以降で問題を再現できません。

この特定のシナリオに言及しているConnectアイテムまたはKB記事も見つかりません(他にも多くのSEQUENCE問題があります)。すべての修正が最終的に文書化されるわけではないため、SP1以前には存在しなかったというわけではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.