Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come risolvere "La funzione di partizione associata genera più partizioni rispetto ai gruppi di file menzionati nello schema" Msg 7707 in SQL Server

Se ricevi il messaggio di errore 7707 in SQL Server, è perché stai tentando di creare uno schema di partizione che non specifica abbastanza filegroup per corrispondere alla funzione di partizione.

Fortunatamente, questo è facile da risolvere.

Esempio di errore

L'errore è simile al seguente:

Msg 7707, Level 16, State 1, Line 1
The associated partition function 'CatsPartitionFunction' generates more partitions than there are file groups mentioned in the scheme 'CatsPartitionScheme'.

Perché è successo?

Nel mio caso, ho specificato tre filegroup durante la creazione dello schema di partizione, ma la funzione di partizione ne ha effettivamente generati quattro.

Ecco il codice che ho usato per creare la funzione di partizione e gli schemi di partizione.

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (1, 100, 10000);
GO  

CREATE PARTITION SCHEME CatsPartitionScheme  
    AS PARTITION CatsPartitionFunction  
    TO (CatsFg1, CatsFg2, CatsFg3);  
GO

La mia funzione di partizione ha tre valori limite, che si traducono in quattro partizioni. Il mio schema di partizione specifica solo tre filegroup (dovrebbero essercene quattro).

Questo è un errore facile da commettere, perché quando crei la funzione di partizione, il numero di valori limite che specifichi è in realtà uno in meno rispetto al numero di partizioni risultanti. In altre parole, il numero di partizioni create sarà uguale al numero di valori limite + 1.

Se non sei completamente pronto, potresti inavvertitamente abbinare il numero di filegroup ai valori limite, dimenticando che devi specificare un altro filegroup.

Correggi l'errore

Quindi, per correggere questo errore, tutto ciò che devo fare è specificare un altro filegroup durante la creazione dello schema di partizione.

Il mio codice dovrebbe assomigliare di più a questo:

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (1, 100, 10000);
GO 

CREATE PARTITION SCHEME CatsPartitionScheme  
    AS PARTITION CatsPartitionFunction  
    TO (CatsFg1, CatsFg2, CatsFg3, CatsFg4);  
GO

In questo caso, ho semplicemente aggiunto CatsFg4 all'elenco dei filegroup. Questo ovviamente presuppone che il filegroup specificato esista.

Tieni inoltre presente che non è necessario creare un filegroup completamente nuovo. Puoi condividere filegroup (ovvero avere più partizioni mappate su un singolo filegroup).

Pertanto, avrei potuto farlo:

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (1, 100, 10000);
GO 

CREATE PARTITION SCHEME CatsPartitionScheme  
    AS PARTITION CatsPartitionFunction  
    TO (CatsFg1, CatsFg2, CatsFg3, CatsFg3);  
GO

Nota che gli ultimi due filegroup sono gli stessi (CatsFg3 ).

Ma non devi fermarti qui. Un altro approccio è avere tutti partizioni mappate al filegroup.

In questo caso potremmo usare ALL argomento e specifica un solo filegroup:

CREATE PARTITION FUNCTION CatsPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (1, 100, 10000);
GO  
 
CREATE PARTITION SCHEME CatsPartitionScheme  
    AS PARTITION CatsPartitionFunction  
    ALL TO (CatsFg1);  
GO