การสลับข้อมูลล้มเหลวด้วย“ อนุญาตค่าที่ไม่ได้รับอนุญาตจากการตรวจสอบข้อ จำกัด หรือฟังก์ชั่นพาร์ติชันบนตารางเป้าหมาย”


12

รับดังต่อไปนี้

-- 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);

จากนั้นย้ายข้อมูลไปรอบ ๆ :

-- 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;

ด้านล่างเป็น "สคริปต์ตารางเป็น ... สร้าง" DDL เพียงเพื่อตรวจสอบโครงสร้างตารางเดียวกัน

/****** 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 ใช้งานได้ดี การสลับในสร้างข้อผิดพลาดต่อไปนี้:

เกี่ยวกับข่าวสาร 4972 ระดับ 16 สถานะ 1 บรรทัด 1 เปลี่ยนแปลงคำสั่งตารางสวิตช์สลับล้มเหลว ตรวจสอบข้อ จำกัด หรือฟังก์ชันพาร์ติชันของตารางต้นฉบับ 'greek.dbo.f_word_swapin' อนุญาตค่าที่ไม่ได้รับอนุญาตจากข้อ จำกัด การตรวจสอบหรือฟังก์ชันพาร์ติชันบนตารางเป้าหมาย 'greek.dbo.f_word'

วิ่ง:

select target_partition_id = $PARTITION.pf_f_word_source_id(source_id), 
    *
from dbo.f_word_swapin;

ตรวจสอบว่าข้อมูลทั้งหมดควรกลับไปที่พาร์ติชัน 13

ฉันค่อนข้างใหม่กับการแบ่งพาร์ติชันดังนั้นฉันแน่ใจว่าฉันทำสิ่งที่ไม่ถูกต้องฉันแค่ไม่รู้ว่ามันคืออะไร


สิ่งนี้สามารถเกิดขึ้นได้หากอย่างน้อยหนึ่งในตารางข้อ จำกัด การตรวจสอบของคุณถูกสร้างขึ้นด้วย NOCHECK

คำตอบ:


19

สิ่งที่เกี่ยวกับCHECKข้อ จำกัด FALSEคือพวกเขาไม่อนุญาตเฉพาะแถวที่ผลตอบแทนวินิจฉัย หากการตรวจสอบกลับUNKNOWNมานั่นไม่ใช่FALSEดังนั้นแถวจะผ่านการตรวจสอบ:

CREATE TABLE dbo.T1 (id int NULL CHECK (id = 1));

INSERT dbo.T1 VALUES (1); -- Ok
INSERT dbo.T1 VALUES (2); -- Error
INSERT dbo.T1 VALUES (NULL); -- Ok!

ข้อ จำกัด การตรวจสอบของคุณไม่อนุญาตให้ใช้NULLค่าซึ่งเป็น 'ค่า' นอกขอบเขตที่SWITCHคำสั่งคัดค้าน ตารางสวิตช์ในของคุณอาจมีค่า Null ซึ่งไม่ได้อยู่ในพาร์ติชัน 2

เพิ่มข้อ จำกัดAND source_id IS NOT NULLของคุณCHECKเมื่อพาร์ติชันปลายทางไม่ใช่พาร์ติชัน 1 (ตำแหน่งที่ไม่มีค่า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.