2012-08-13 13 views
10

मैं वर्तमान में Change Data Capture को अस्थायी डेटाबेस स्टोर करने के विकल्प के रूप में खोज रहा हूं। यह बहुत अच्छा है क्योंकि यह केवल डेल्टा स्टोर करता है और ऐसा लगता है कि यह मेरी समस्या का समाधान कर सकता है। जब मैंने सीडीसी सक्षम किया, तो टेबल का एक गुच्छा System Tables के अंतर्गत दिखाई दिया।मैं ऐतिहासिक दृश्य का पुनर्निर्माण कैसे करूं?

cdc.dbo_MyTable से पूछताछ करते समय, मैं तालिका में होने वाले सभी परिवर्तनों को देखने में सक्षम हूं। अब, मैं ऐतिहासिक दृश्य कैसे बनाऊंगा? उदाहरण के लिए, अगर मैं किसी विशेष तारीख के रूप में अपनी तालिका की स्थिति देखना चाहता था, तो मैं ऐसा करने के लिए कैसे जाऊं? क्या यह भी संभव है?

ऐसा लगता है कि मुझे लॉग लेने और अपनी मूल तालिका पर इसे लागू करना शुरू करना है, लेकिन मैं सोच रहा था कि ऐसा करने का एक अंतर्निहित तरीका है या नहीं। कोई सुझाव?

  • समय में एक खास बिंदु पर ग्राफ के राज्य पता
  • को देखते हुए दो अलग अलग समय पर रेखांकन, जानते हैं कि अलग हैं लिंक के सेट:

    उपयोग के मामलों में से कुछ मैं देख रहा हूँ (यह संभवतः टेबल बनाने के बाद एक EXCEPT खंड का उपयोग करके प्राप्त किया जा सकता है)

+0

आप क्या मतलब है कि आप diff की गणना करना चाहते हैं? उदाहरण आउटपुट? – Jaguar

+0

@ जगुआर: दो उपयोग मामलों को जोड़ा गया। धन्यवाद! – Legend

उत्तर

6

यह संभव है, लेकिन अंतर्निहित तरीके से मैं डरता हूं। आपको हाथ से समयरेखा का पुनर्निर्माण करना होगा।

यह देखते हुए कि परिवर्तन-ट्रैकिंग तालिका tran_end_time प्रदान करती है, यह वह समय है जब संपत्ति का मूल्य जारी रखा जाना चाहिए, आपको एक ऐसी क्वेरी बनाना होगा जो तालिका राज्यों की सभी अलग-अलग अवधियों को प्राप्त करे, ट्रैक की गई संपत्ति में परिवर्तन और फिर पिवट (तालिका के समान रूप में प्रेजेंटेशन प्राप्त करने के लिए)। तालिका राज्य के साथ यूनियनों को अपने मूल्यों को प्राप्त करने के लिए मत भूलना जिन्हें पूर्णता के लिए बदला/ट्रैक नहीं किया गया है।

अंतिम परिणाम, सरल, जैसे

RN PK PropA PropB FromDate   ToDate 
1 1 'Ver1' 'Ver1' 2012-01-01 09:00 2012-01-02 08:00 
2 1 'Ver1' 'Ver2' 2012-01-02 08:00 2012-01-03 07:00 
3 1 'Ver2' 'Ver2' 2012-01-03 07:00 *getdate()* 
4 2 'Ver1' 'Ver1' 2012-01-01 05:00 2012-01-02 06:00 
5 2 'Ver1' 'Ver2' 2012-01-02 06:00 2012-01-03 01:00 
6 2 'Ver2' 'Ver2' 2012-01-03 01:00 *getdate()* 

टिप्पणी दिखना चाहिए कि getdate() मान्य है अगर पंक्ति को हटाया नहीं गया जिस स्थिति में यह विलोपन तारीख के साथ प्रतिस्थापित किया जाना चाहिए

संपादित करें, 2 उपयोग मामलों के लिए। पहला बिंदु आसानी से संबोधित किया जाता है यह लौकिक वस्तु ग्राफ के निर्माण और उसके बाद छानने की बात है:

declare @pointInTime datetime = '20120102 10:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate 

दूसरी बात है, सिवाय इसके खंड के साथ आसानी से उत्पन्न किया जा सकता, जैसा कि आप बाहर बिंदु। ऊपर क्वेरी दिया:

declare @pointInTimeA datetime = '20120102 10:00'; 
declare @pointInTimeB datetime = '20120103 01:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate 
EXCEPT 
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate 

अभी तक except खंड केवल पंक्तियों है कि कम से कम एक अलग स्तंभ मान प्रस्तुत करता है, मुझे नहीं पता कि वह जानकारी मानव आंखों के लिए वास्तव में सार्थक है या नहीं। आपकी ज़रूरतों के आधार पर एक क्वेरी जो सीधे cdc डेटा पर काम करती है, वह अधिक उपयुक्त हो सकती है।

+1

+1 आपके समय और प्रयास के लिए धन्यवाद! मैं इस गहराई से पता लगाऊंगा और इसे अनुकूलित करूँगा। बक्षीस का पुरस्कार! :) – Legend

0

You may want to check out Snapshots, जो एसक्यूएल सर्वर करने के लिए 2005 के बाद से

यदि आप केवल कुछ ही timepoints जरूरत है ये आपके लिए सबसे अधिक उपयोगी हो सकता है, लेकिन वे आपको एक जटिल डेटाबेस में तालिकाओं के सभी ट्रैक करने में मदद कर सकते हैं बनाया गया है ।

ये Compared to a full copy of a database, however, snapshots are highly space efficient. A snapshot requires only enough storage for the pages that change during its lifetime. Generally, snapshots are kept for a limited time, so their size is not a major concern.

+4

स्नैपशॉट उपयोगी हो सकते हैं यदि आप जानते हैं कि * समय * समय पर आप डेटा की एक प्रति रखना चाहते हैं। यदि आप सोच रहे हैं "कल 2 बजे राज्य क्या था", और आपने कल दोपहर 2 बजे स्नैपशॉट नहीं लिया, तो वे मदद नहीं करेंगे। –

0

डेल्टा हैं, इसलिए मैं इस बारे में निश्चित, ऐसा कुछ कभी नहीं किया है, लेकिन हो सकता है आप तालिका परिवर्तन आप का ट्रैक रख सकते करने के लिए एक स्तंभ "changeset" जोड़ सकते हैं नहीं कर रहा हूँ मेज पर, हर बार जब कोई लेनदेन होता है तो अधिकतम (चेंजसेट) प्राप्त होता है और नए कैनजेस को अगले मान के साथ सहेजता है ... या यदि आपके पास टाइमस्टैम्प है और कुछ समय पर आपकी तालिका की स्थिति जानना चाहते हैं तो परिवर्तनों को फ़िल्टर करने के लिए क्वेरी करें जिस तारीख को आप देखना चाहते हैं उससे पहले ... (मुझे यह नहीं पता कि मुझे यह लिखना चाहिए या कोई टिप्पणी है ... मैं यहां नया हूं)

वैसे भी, उम्मीद है कि यह मदद करता है ...

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