私はSEQUENCE
オブジェクトを利用する特定のテーブルをテストしてデータを設定している最中です。このプロセスでは、数万行の挿入行をテーブルに挿入するテストを行っています(これをプログラミングする方法に慣れていないため)。この特定のテーブルで見られる問題は、別のポピュレーションテストを開始したときに、SEQUENCE
が必要な最初の数(1)にリセットされないことです。
新しいテストを再実行する場合は、問題のテーブルを削除してから、次のコマンドを実行します。
DROP SEQUENCE foo.fee;
GO
DROP SCHEMA foo;
GO
テストを再実行する場合は、次のSCHEMA
&SEQUENCE
コマンドを実行します。これらのコマンドは、以下の順序で実行されます。
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のインストールです。
やってみる
ALTER SEQUENCE foo.fee
RESTART
または:
ALTER SEQUENCE foo.fee
RESTART WITH 1
いくつかのわずかな変更を加えたスクリプトの使用:
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以前には存在しなかったとは限りません。