web-dev-qa-db-ja.com

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

私は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

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

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

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

13
Techie Joe

やってみる

ALTER SEQUENCE foo.fee
RESTART

または:

ALTER SEQUENCE foo.fee
RESTART WITH 1

http://msdn.Microsoft.com/en-us/library/ff878572.aspx

15
Bacon Bits

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

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以前には存在しなかったとは限りません。

5
Paul White 9