Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir “A função de partição associada gera mais partições do que grupos de arquivos mencionados no esquema” Msg 7707 in SQL Server


Se você receber a mensagem de erro 7707 no SQL Server, é porque está tentando criar um esquema de partição que não especifica grupos de arquivos suficientes para corresponder à função de partição.

Felizmente, isso é fácil de corrigir.

Exemplo do erro


O erro é algo assim:
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'.

Por que isso aconteceu?


No meu caso, especifiquei três grupos de arquivos ao criar o esquema de partição, mas a função de partição gerou quatro.

Aqui está o código que usei para criar a função de partição e os esquemas de partição.
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

Minha função de partição tem três valores de limite, o que resulta em quatro partições. Meu esquema de partição especifica apenas três grupos de arquivos (deve haver quatro).

Este é um erro fácil de cometer, porque quando você cria a função de partição, o número de valores de limite que você especifica é, na verdade, um a menos que o número de partições resultantes. Em outras palavras, o número de partições criadas será igual ao número de valores de limite + 1.

Se você não estiver completamente na bola, você pode inadvertidamente combinar o número de grupos de arquivos com os valores de limite, esquecendo que você precisa especificar mais um grupo de arquivos.

Corrigir o erro


Portanto, para corrigir esse erro, tudo o que preciso fazer é especificar mais um grupo de arquivos ao criar o esquema de partição.

Meu código deve ficar mais assim:
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

Neste caso, eu simplesmente adicionei CatsFg4 para a lista de grupos de arquivos. Isso obviamente pressupõe que o grupo de arquivos especificado existe.

Observe também que você não precisa necessariamente criar um novo grupo de arquivos. Você pode compartilhar grupos de arquivos (ou seja, ter várias partições mapeadas para um único grupo de arquivos).

Portanto, eu poderia ter feito isso:
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

Observe que os dois últimos grupos de arquivos são iguais (CatsFg3 ).

Mas você não precisa parar por aí. Outra abordagem é ter todos partições mapeadas para o grupo de arquivos.

Neste caso, poderíamos usar o ALL argumento e especifique apenas um grupo de arquivos:
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