Angesichts der folgenden
-- table ddl
create table dbo.f_word(
sentence_id int NULL,
sentence_word_id int NULL,
word_id int NULL,
lemma_id int NULL,
source_id int NULL,
part_of_speech_id int NULL,
person_id int NULL,
gender_id int NULL,
number_id int NULL,
tense_id int NULL,
voice_id int NULL,
mood_id int NULL,
case_id int NULL,
degree_id int NULL,
citation nvarchar(100) NULL
);
-- create partition function
create partition function pf_f_word_source_id (int)
as range left for values
(
1,2,3,4,5,6,7,8,9,10,11,12,13,14,
15,16,17,18,19,20,21,22,23
);
-- create the partition scheme
create partition scheme ps_f_word as partition pf_f_word_source_id to
(
[primary],[primary],[primary],[primary],[primary],[primary],[primary],[primary],[primary],
[primary],[primary],[primary],[primary],[primary],[primary],[primary],[primary],[primary],
[primary],[primary],[primary],[primary],[primary],[primary]
);
-- partition the index
create unique clustered index cix_fword on dbo.f_word
(
source_id,
sentence_id,
sentence_word_id,
word_id,
lemma_id,
part_of_speech_id,
person_id,
gender_id,
number_id,
tense_id,
voice_id,
mood_id,
case_id,
degree_id
)
on ps_f_word (source_id);
-- swapin table ddl
create table dbo.f_word_swapin(
sentence_id int NULL,
sentence_word_id int NULL,
word_id int NULL,
lemma_id int NULL,
source_id int NULL,
part_of_speech_id int NULL,
person_id int NULL,
gender_id int NULL,
number_id int NULL,
tense_id int NULL,
voice_id int NULL,
mood_id int NULL,
case_id int NULL,
degree_id int NULL,
citation nvarchar(100) NULL
) on [primary];
-- create the same index on the swapin table
create unique clustered index cix_fword_swapin on dbo.f_word_swapin
(
source_id,
sentence_id,
sentence_word_id,
word_id,
lemma_id,
part_of_speech_id,
person_id,
gender_id,
number_id,
tense_id,
voice_id,
mood_id,
case_id,
degree_id
);
-- add check constraints WITH CHECK
ALTER TABLE dbo.f_word_swapin
WITH CHECK
ADD CONSTRAINT ck_f_word_swapin_lb
CHECK ( source_id > 12);
ALTER TABLE dbo.f_word_swapin
WITH CHECK
ADD CONSTRAINT ck_f_word_swapin_ub
CHECK ( source_id <= 13);
Verschieben Sie dann die Daten:
-- switch data OUT of the partitioned table
ALTER TABLE dbo.f_word
SWITCH PARTITION 13 TO dbo.f_word_swapin;
-- attempt to switch data back IN
ALTER TABLE dbo.f_word_swapin
SWITCH TO dbo.f_word PARTITION 13;
Unten finden Sie die DDL "Script Table As ... CREATE", um dieselben Tabellenstrukturen zu überprüfen.
/****** Object: Table [dbo].[f_word_swapin] Script Date: 9/10/2014 10:01:01 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[f_word_swapin](
[sentence_id] [int] NULL,
[sentence_word_id] [int] NULL,
[word_id] [int] NULL,
[lemma_id] [int] NULL,
[source_id] [int] NULL,
[part_of_speech_id] [int] NULL,
[person_id] [int] NULL,
[gender_id] [int] NULL,
[number_id] [int] NULL,
[tense_id] [int] NULL,
[voice_id] [int] NULL,
[mood_id] [int] NULL,
[case_id] [int] NULL,
[degree_id] [int] NULL,
[citation] [nvarchar](100) NULL
) ON [PRIMARY]
/****** Object: Table [dbo].[f_word] Script Date: 9/10/2014 10:09:43 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[f_word](
[sentence_id] [int] NULL,
[sentence_word_id] [int] NULL,
[word_id] [int] NULL,
[lemma_id] [int] NULL,
[source_id] [int] NULL,
[part_of_speech_id] [int] NULL,
[person_id] [int] NULL,
[gender_id] [int] NULL,
[number_id] [int] NULL,
[tense_id] [int] NULL,
[voice_id] [int] NULL,
[mood_id] [int] NULL,
[case_id] [int] NULL,
[degree_id] [int] NULL,
[citation] [nvarchar](100) NULL
)
GO
AUSSCHALTEN funktioniert einwandfrei. Das EINSCHALTEN erzeugt den folgenden Fehler:
Meldung 4972, Ebene 16, Status 1, Zeile 1 Die Anweisung ALTER TABLE SWITCH ist fehlgeschlagen. Check Constraints oder Partitionsfunktion der Quelltabelle 'greek.dbo.f_word_swapin' erlaubt Werte, die von Check Constraints oder Partitionsfunktion der Zieltabelle 'greek.dbo.f_word' nicht erlaubt sind.
Laufen:
select target_partition_id = $PARTITION.pf_f_word_source_id(source_id),
*
from dbo.f_word_swapin;
überprüft, ob alle Daten in Partition 13 zurückgehen sollen.
Ich bin ziemlich neu in der Partitionierung, also bin ich mir sicher, dass ich Dinge falsch mache, ich weiß nur nicht, was es ist.
sql-server
partitioning
sql-server-2014
Swasheck
quelle
quelle
Antworten:
Das Problem bei
CHECK
Einschränkungen ist, dass sie nur Zeilen verbieten, für die das Prädikat zurückgibtFALSE
. Wenn der Scheck zurückgegebenUNKNOWN
wird, ist dies nichtFALSE
der Fall, und die Zeile besteht den Scheck:Ihre Check-Einschränkung verbietet keine
NULL
Werte. Dies ist der Wert außerhalb desSWITCH
gültigen Bereichs, gegen den die Anweisung Einwände erhebt. Ihre Einschalttabelle enthält möglicherweise Nullen, die nicht zu Partition 2 gehören.Fügen Sie
AND source_id IS NOT NULL
IhrerCHECK
Einschränkung hinzu, wenn die Zielpartition nicht Partition 1 ist (wohin die Nullen gehen).quelle