Dado o seguinte
-- 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);
Em seguida, mova os dados:
-- 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;
Abaixo está o DDL "Script Table As ... CREATE" apenas para verificar as mesmas estruturas da tabela.
/****** 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
SWITCHING OUT funciona muito bem. SWITCHing IN produz o seguinte erro:
Msg 4972, Nível 16, Estado 1, Linha 1 Falha na instrução ALTER TABLE SWITCH. Verificar restrições ou função de partição da tabela de origem 'greek.dbo.f_word_swapin' permite valores que não são permitidos por restrições de verificação ou função de partição na tabela de destino 'greek.dbo.f_word'.
Corrida:
select target_partition_id = $PARTITION.pf_f_word_source_id(source_id),
*
from dbo.f_word_swapin;
verifica se todos os dados devem voltar para a partição 13.
Sou muito novo em particionamento, então tenho certeza de que estou fazendo as coisas incorretamente, só não sei o que é.
O problema das
CHECK
restrições é que elas apenas não permitem linhas para as quais o predicado retornaFALSE
. Se a verificação retornarUNKNOWN
, isso não éFALSE
, então a linha passa na verificação:Sua restrição de verificação não permite
NULL
valores, que é o 'valor' fora do intervalo ao qual aSWITCH
instrução está se opondo. Sua tabela de troca pode conter nulos, que não pertencem à partição 2.Adicione
AND source_id IS NOT NULL
à suaCHECK
restrição, quando a partição de destino não for a partição 1 (para onde vão os nulos).