sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren "De bijbehorende partitiefunctie genereert meer partities dan er bestandsgroepen worden genoemd in het schema" Msg 7707 in SQL Server

Als je foutmelding 7707 krijgt in SQL Server, komt dat omdat je een partitieschema probeert te maken dat niet genoeg bestandsgroepen specificeert om overeen te komen met de partitiefunctie.

Gelukkig is dit eenvoudig op te lossen.

Voorbeeld van de fout

De fout ziet er ongeveer zo uit:

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

Waarom is dit gebeurd?

In mijn geval heb ik drie bestandsgroepen gespecificeerd bij het maken van het partitieschema, maar de partitiefunctie genereerde er in feite vier.

Dit is de code die ik heb gebruikt om de partitiefunctie en partitieschema's te maken.

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

Mijn partitiefunctie heeft drie grenswaarden, wat resulteert in vier partities. Mijn partitieschema specificeert slechts drie bestandsgroepen (er zouden er vier moeten zijn).

Dit is een makkelijke fout om te maken, want wanneer u de partitiefunctie maakt, is het aantal grenswaarden dat u opgeeft in feite één minder dan het aantal resulterende partities. Met andere woorden, het aantal gecreëerde partities zal gelijk zijn aan het aantal grenswaarden + 1.

Als je niet helemaal bij de les bent, zou je per ongeluk het aantal bestandsgroepen kunnen matchen met de grenswaarden, waarbij je vergeet dat je nog een bestandsgroep moet specificeren.

Verhelp de fout

Dus om deze fout op te lossen, hoef ik alleen maar nog een bestandsgroep op te geven bij het maken van het partitieschema.

Mijn code zou er ongeveer zo uit moeten zien:

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 dit geval heb ik gewoon CatsFg4 . toegevoegd naar de lijst met bestandsgroepen. Dit veronderstelt uiteraard dat de gespecificeerde bestandsgroep bestaat.

Merk ook op dat u niet per se een hele nieuwe bestandsgroep hoeft aan te maken. U kunt bestandsgroepen delen (d.w.z. meerdere partities hebben toegewezen aan een enkele bestandsgroep).

Daarom had ik dit kunnen doen:

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

Merk op dat de laatste twee bestandsgroepen hetzelfde zijn (CatsFg3 ).

Maar je hoeft daar niet te stoppen. Een andere benadering is om alle . te hebben partities toegewezen aan de bestandsgroep.

In dit geval zouden we de ALL . kunnen gebruiken argument, en specificeer slechts één bestandsgroep:

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


  1. mysqli of PDO - wat zijn de voor- en nadelen?

  2. Upgraden naar PostgreSQL 11 met logische replicatie

  3. Query om alle rijen van de vorige maand te krijgen

  4. Een SQL-query om een ​​string te selecteren tussen twee bekende strings