2010-04-16 8 views
5

जब एक नया स्तंभ तालिका है कि परिवर्तन डेटा कैप्चर (सीडीसी) के लिए कॉन्फ़िगर किया गया है में जोड़ा जाता है, पर कब्जा उदाहरण तालिका नया स्तंभ तक सीडीसी विकलांग और स्रोत तालिका में पुनः सक्षम है नहीं होगा। प्रक्रिया में मौजूदा कैप्चर उदाहरण गिरा दिया गया है।Sql सर्वर बदलें डाटा कैप्चर: इतिहास संरक्षण जब कॉलम जोड़ने?

मैंने सोचा कि मैं एक अस्थायी तालिका के लिए बाहर मौजूदा डेटा नकल कर सकता है और उसके बाद निम्न SQL का उपयोग कर वापस कॉपी। हालांकि, अन्य सीडीसी मेटा जानकारी, जैसे cdc.change_tables.start_lsn, अमान्य हो जाती है।

कैसे कब्जा उदाहरण इतिहास को संरक्षित किया जा सकता है, एक ही कब्जा उदाहरण के नाम का उपयोग करते हुए अगर सब पर?

धन्यवाद, रिच

/*Change Data Capture Test - Alter table definition test */ 

/*Enter restricted mode so we don't lose data changes during this process*/ 
alter database ChangeDataCaptureTest set AUTO_UPDATE_STATISTICS_ASYNC OFF 
alter database ChangeDataCaptureTest set RESTRICTED_USER with ROLLBACK IMMEDIATE 
go 

/*Add a column to the table*/ 
alter table dbo.Table1 add value3 varchar(20) DEFAULT '' not null 

/*Copy the existing change tracking into a temp table*/ 
select * into cdc.dbo_Table1_temp from cdc.dbo_Table1_CT 

/*Add the new column to the temp table so that we don't have to map 
all columns when we copy back, note that we use NULL as the default*/ 
alter table cdc.dbo_Table1_temp add value3 varchar(20) DEFAULT NULL 

/*Disable CDC on the source table, this will drop the associated cdc table*/ 
exec sys.sp_cdc_disable_table 
@source_schema='dbo', 
@source_name='Table1', 
@capture_instance='dbo_Table1' 

/*Enable CDC for the table which recreates the CDC table*/ 
EXEC sys.sp_cdc_enable_table 
@source_schema = N'dbo', 
@source_name = N'Table1', 
@role_name  = NULL, 
@supports_net_changes = 1, 
@filegroup_name = N'ChangeDataCapture' 
GO 

/*Insert values from the temp table back into the new CDC Table*/ 
Insert into cdc.dbo_Table1_CT 
SELECT * 
From cdc.dbo_Table1_temp 
go 

/*Drop the temp table*/ 
drop table cdc.dbo_Table1_temp 

/*Go back into multi-user mode*/ 
alter database ChangeDataCaptureTest set AUTO_UPDATE_STATISTICS_ASYNC ON 
alter database ChangeDataCaptureTest set MULTI_USER 
go 

/*Add a new row to the table*/ 
insert into table1 
values(12,'zz','g') 
+0

आप शायद उन्हें एक ही तालिका में वापस नहीं हो सकता। उन्हें एक नई तालिका में कॉपी करें। रिपोर्ट को पुनर्प्राप्त करते समय, 'यूनियन' जो पिछले रिकॉर्ड प्राप्त करने के लिए तालिका है। –

उत्तर

-2

मुझे लगता है कि आप भी LSN रिकॉर्ड को लिखने और फिर lsntimemapping तालिका में उन्हें वापस लाने होगा।

0

रिच,

सबसे अच्छा तरीका इस तरह के डेटा को बचाने के लिये एक मचान तालिका कायम समय-समय पर _CT तालिका डेटा पर कब्जा करने के तैयार करना है। कि सीडीसी डेटा को जानने का आम तौर पर एक छोटी शैल्फ जीवन से पहले अंतिम बिंदु (गोदाम/डाटा मार्ट, आदि) आप यह सुनिश्चित कर सकते हैं कि किसी भी परिवर्तन एक रखरखाव खिड़की जो उस समय _CT तालिका डेटा में बंद नकल की जाती है के भीतर पूरी कर से भस्म हो गया है लागू किए जा रहे परिवर्तन से पहले मंचन।

इस पर विचार करने का एक पहलू यह है कि एक बार _CT स्कीमा बदल दिया गया है (एक या अधिक कॉलम जोड़कर या हटाकर) उस डेटा को एंडपॉइंट में खींचने के लिए उपयोग की जाने वाली प्रक्रिया को भी अपडेट किया जाना चाहिए।

इस पर काबू पाने के लिए हमने एक स्क्रिप्ट स्टोर लागू किया जो स्टेजिंग टेबल (_CT और एंडपॉइंट के बीच उपयोग किया गया) की इच्छित स्कीमा संग्रहीत करता है और एक बार क्लाइंट डीबी पर परिवर्तन लागू होने के बाद, हम डेटा को एंडपॉइंट और अपडेट में ले जाने से स्थानांतरित करते हैं स्टेजिंग स्कीमा।

उम्मीद है कि इस विचार के लिए भोजन प्रदान करेगा।

संबंधित मुद्दे