Ripristino di una sequenza di SQL Server 2012


13

Sto testando e popolando una tabella specifica che sfrutta l' SEQUENCEoggetto. In questo processo sto testando il popolamento della tabella con decine di migliaia di righe di inserimento (poiché non ho familiarità con come programmare questo). Il problema che sto vedendo con questa tabella specifica è che quando avvio un altro test di popolazione, SEQUENCEnon viene ripristinato il primo numero desiderato (che è 1).

Quando desidero rieseguire un nuovo test, elimino la tabella in questione, quindi eseguo quanto segue:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

Quando voglio rieseguire il test, eseguo i seguenti comandi SCHEMAe SEQUENCE, che vengono attivati ​​nell'ordine seguente:

CREATE SCHEMA foo;
GO

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

GO

Quindi creo la tabella:

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

Una volta completato, eseguo il seguente comando di inserimento 50.000 volte:

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'
)

Ora non c'è assolutamente alcun problema con l'inserimento dei dati nella tabella. La sfida che sto incontrando è che quando elimino la tabella, rilasciare lo schema e la sequenza, quindi ricreare la tabella, la sequenza e lo schema ripresi SEQUENCEdall'ultimo numero nell'incarnazione del database precedente e non reimpostarli su uno.

Ad esempio, se l'ultimo numero della sequenza è 634.534, il numero di sequenza successivo nella nuova tabella è 634.535.

Dopo aver eliminato la tabella e rilasciato lo schema e la sequenza, eseguo quanto segue per verificare la rimozione della sequenza e dello schema:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

Sono sconcertato sul perché questo stia accadendo. C'è un altro comando che mi manca qui che mi aiuterebbe a localizzare esattamente cosa sta succedendo qui?

Devo notare che questa tabella appartiene a un database con altre 7 tabelle che eseguono SEQUENCEcorrettamente il comando.

Questa è un'installazione di SQL 2012 SP1 Enterprise Edition.

Risposte:



5

Usando il tuo script con alcune lievi modifiche:

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;

... Non riesco a riprodurre il problema su SQL Server 2012 SP1 (build 3000) o versione successiva.

Non riesco a trovare un articolo Connect o l'articolo KB che menzioni questo particolare scenario (e ci sono stati molti altri SEQUENCEproblemi). Questo non vuol dire che non esistesse pre-SP1 perché non tutte le correzioni finiscono per essere documentate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.