खोज…


टिप्पणियों

SQL सर्वर 2016 सिस्टम-वर्जन वाली टेम्पोरल टेबलों के लिए एक डेटाबेस फीचर के रूप में सपोर्ट का परिचय देता है, जो किसी भी समय टेबल में स्टोर किए गए डेटा के बारे में जानकारी प्रदान करने के लिए बिल्ट-इन सपोर्ट लाता है, न कि केवल उस डेटा के बजाय जो वर्तमान समय में सही है।

सिस्टम-वर्जन वाली टेम्पोरल टेबल SQL सर्वर 2016 में एक नई प्रकार की उपयोगकर्ता तालिका है, जिसे डेटा परिवर्तनों का पूरा इतिहास रखने और समय विश्लेषण में आसान बिंदु की अनुमति देने के लिए डिज़ाइन किया गया है। इस प्रकार की टेम्पोरल टेबल को सिस्टम-वर्जन वाली टेम्पोरल टेबल के रूप में संदर्भित किया जाता है क्योंकि प्रत्येक पंक्ति की वैधता की अवधि सिस्टम (अर्थात डेटाबेस इंजन) द्वारा प्रबंधित की जाती है। प्रत्येक लौकिक तालिका में दो स्पष्ट रूप से परिभाषित कॉलम होते हैं, प्रत्येक में डेटाटाइम 2 डेटा प्रकार होता है। इन स्तंभों को काल स्तंभ कहा जाता है। जब भी कोई पंक्ति संशोधित की जाती है, तो इन अवधि स्तंभों का उपयोग सिस्टम द्वारा प्रत्येक पंक्ति की वैधता की अवधि को रिकॉर्ड करने के लिए किया जाता है।

अस्थायी टेबल्स बनाएँ

CREATE TABLE dbo.Employee   
(    
  [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED   
  , [Name] nvarchar(100) NOT NULL  
  , [Position] varchar(100) NOT NULL   
  , [Department] varchar(100) NOT NULL  
  , [Address] nvarchar(1024) NOT NULL  
  , [AnnualSalary] decimal (10,2) NOT NULL  
  , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START  
  , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END  
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
 )    
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));  

INSERTS: एक INSERT पर , सिस्टम वैलिडफ्रॉम कॉलम के लिए मूल्य को मौजूदा लेनदेन के शुरुआती समय (UTC टाइम ज़ोन में) सिस्टम घड़ी के आधार पर सेट करता है और ValidTo कॉलम के लिए 9999 के अधिकतम मूल्य पर मान प्रदान करता है- 12-31। यह पंक्ति को खुले रूप में चिह्नित करता है।

अद्यतन: एक अद्यतन पर , सिस्टम हिस्ट्री टेबल में पंक्ति के पिछले मूल्य को संग्रहीत करता है और सिस्टम घड़ी के आधार पर ValidTo कॉलम के लिए वर्तमान लेनदेन (यूटीसी समय क्षेत्र में) के शुरुआती समय के लिए मूल्य निर्धारित करता है। यह पंक्ति को बंद के रूप में चिह्नित करता है, जिसकी अवधि दर्ज की गई थी जिसके लिए पंक्ति मान्य थी। वर्तमान तालिका में, पंक्ति को उसके नए मूल्य के साथ अद्यतन किया जाता है और सिस्टम सिस्टम घड़ी के आधार पर लेन-देन के शुरुआती समय (यूटीसी समय क्षेत्र में) के लिए वैलिडफ्रॉम कॉलम के लिए मूल्य निर्धारित करता है। ValidTo कॉलम के लिए वर्तमान तालिका में अपडेट की गई पंक्ति का मान अधिकतम मूल्य 9999-12-31 है।

DELETES : DELETE पर , सिस्टम हिस्ट्री टेबल में पंक्ति के पिछले मूल्य को संग्रहीत करता है और ValidTo कॉलम के लिए मूल्य को मौजूदा लेनदेन (UTC समय क्षेत्र में) सिस्टम घड़ी के आधार पर सेट करता है। यह पंक्ति को बंद के रूप में चिह्नित करता है, जिसमें एक अवधि दर्ज होती है जिसके लिए पिछली पंक्ति मान्य थी। वर्तमान तालिका में, पंक्ति को हटा दिया जाता है। वर्तमान तालिका की क्वेरी इस पंक्ति को वापस नहीं करेगी। केवल वे प्रश्न जो इतिहास डेटा से संबंधित डेटा लौटाते हैं जिनके लिए एक पंक्ति बंद है।

MERGE : किसी MERGE पर , ऑपरेशन बिल्कुल वैसा ही व्यवहार करता है जैसे MERGE स्टेटमेंट में क्रियाओं के रूप में निर्दिष्ट किए गए तीन बयानों (एक INSERT , एक UPDATE , और / या एक DELETE ) तक।

युक्ति: सिस्टम डेटाटाइम 2 कॉलम में दर्ज किया गया समय स्वयं लेनदेन के शुरुआती समय पर आधारित होता है। उदाहरण के लिए, एकल लेन-देन के भीतर डाली गई सभी पंक्तियों में एक ही UTC समय दर्ज होगा जो System_TIME अवधि की शुरुआत के अनुरूप कॉलम में दर्ज किया जाएगा।

मैं अस्थायी डेटा की क्वेरी कैसे करूं?

SELECT * FROM Employee   
    FOR SYSTEM_TIME    
        BETWEEN '2014-01-01 00:00:00.0000000' AND '2015-01-01 00:00:00.0000000'   
            WHERE EmployeeID = 1000 ORDER BY ValidFrom;  

वास्तविक मान निर्दिष्ट समय में वापस करें (SYSTEM_TIME AS के लिए) )

अतीत में समय में निर्दिष्ट बिंदु पर वास्तविक (वर्तमान) थे मानों वाली पंक्तियों के साथ एक तालिका लौटाता है।

SELECT * FROM Employee   
    FOR SYSTEM_TIME AS  OF '2016-08-06 08:32:37.91'

SYSTEM_TIME BETWEEN के लिए तथा

ऊपर के रूप में उसी के लिए SYSTEM_TIME FROM <start_date_time> से <end_date_time> विवरण के अलावा, दी गई पंक्तियों की तालिका में उन पंक्तियों को शामिल किया गया है जो <end_date_time: endpoint द्वारा परिभाषित ऊपरी सीमा पर सक्रिय हो गए हैं।

SELECT * FROM Employee   
    FOR SYSTEM_TIME BETWEEN  '2015-01-01' AND '2015-12-31' 

SYSTEM_TIME FROM के लिए सेवा

सभी पंक्ति संस्करणों के लिए मानों के साथ एक तालिका लौटाता है जो निर्दिष्ट समय सीमा के भीतर सक्रिय थे, चाहे वे <start_date_time> FROM तर्क के लिए पैरामीटर मान से पहले सक्रिय होने लगे हों या <end_date-time> पैरामीटर मान के बाद सक्रिय होने के लिए बंद हो गए हों तर्क करना। आंतरिक रूप से, एक संघ लौकिक तालिका और उसके इतिहास तालिका के बीच किया जाता है और परिणाम सभी पंक्ति संस्करणों के लिए मानों को वापस करने के लिए फ़िल्टर किए जाते हैं जो निर्दिष्ट समय सीमा के दौरान किसी भी समय सक्रिय थे। FROM एंडपॉइंट द्वारा परिभाषित निचली सीमा पर वास्तव में सक्रिय होने वाली पंक्तियों को शामिल किया गया है और TO एंडपॉइंट द्वारा परिभाषित ऊपरी सीमा पर सक्रिय होने वाले रिकॉर्ड शामिल नहीं हैं।

SELECT * FROM Employee   
    FOR SYSTEM_TIME FROM '2015-01-01' TO '2015-12-31' 

SYSTEM_TIME में शामिल होने के लिए ( , )

सभी पंक्ति संस्करणों के लिए मानों के साथ एक तालिका लौटाता है जो कि निर्दिष्ट तर्क के लिए दो डेटाइम मानों द्वारा निर्धारित निर्दिष्ट समय सीमा के भीतर खोले और बंद किए गए थे। निचली सीमा पर सक्रिय होने वाली पंक्तियाँ या ऊपरी सीमा पर सक्रिय होना बंद हो जाती हैं।

SELECT * FROM Employee
    FOR SYSTEM_TIME CONTAINED IN ('2015-04-01', '2015-09-25')   

SYSTEM_TIME सभी के लिए

पंक्तियों का संघ लौटाता है जो वर्तमान और इतिहास तालिका से संबंधित है।

SELECT * FROM Employee
    FOR SYSTEM_TIME ALL

मेमोरी-ऑप्टिमाइज्ड सिस्टम-वर्जन टेम्पोरल टेबल बनाना और SQL सर्वर हिस्ट्री टेबल की सफाई करना

जब आप नामकरण को नियंत्रित करना चाहते हैं और तब भी डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ इतिहास तालिका बनाने के लिए सिस्टम पर भरोसा करते हैं, तो एक डिफ़ॉल्ट इतिहास तालिका के साथ एक अस्थायी तालिका बनाना एक सुविधाजनक विकल्प है। नीचे दिए गए उदाहरण में, एक नया सिस्टम-संस्करण स्मृति-अनुकूलित टेम्पोरल टेबल एक नए डिस्क-आधारित इतिहास तालिका से जुड़ा हुआ है।

CREATE SCHEMA History  
GO  
CREATE TABLE dbo.Department   
(  
    DepartmentNumber char(10) NOT NULL PRIMARY KEY NONCLUSTERED,   
    DepartmentName varchar(50) NOT NULL,   
    ManagerID int  NULL,   
    ParentDepartmentNumber char(10) NULL,   
    SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,   
    SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,     
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)     
)  
WITH   
    (  
        MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA,  
        SYSTEM_VERSIONING = ON ( HISTORY_TABLE = History.DepartmentHistory )   
    );  

SQL सर्वर इतिहास तालिका की सफाई समय के साथ इतिहास तालिका में काफी वृद्धि हो सकती है। हिस्ट्री टेबल से डेटा डालने, अपडेट करने या डिलीट करने की अनुमति नहीं है, हिस्ट्री टेबल को साफ करने का एकमात्र तरीका सिस्टम वर्जन को निष्क्रिय करना है:

ALTER TABLE dbo.Employee

सेट (SYSTEM_VERSIONING = OFF); जाओ

इतिहास तालिका से अनावश्यक डेटा हटाएं:

    DELETE FROM dbo.EmployeeHistory

जहां एंडटाइम <= '2017-01-26 14:00:29';

और फिर सिस्टम संस्करण को फिर से सक्षम करें:

ALTER TABLE dbo.Employee

SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo]। [EmployeeHistory], DATA_CONSISTENCY_CHECK = ON));

Azure SQL डेटाबेस में इतिहास तालिका को साफ करना थोड़ा अलग है, क्योंकि Azure SQL डेटाबेस में इतिहास तालिका की सफाई के लिए अंतर्निहित समर्थन है। पहले, टेम्पोरल हिस्ट्री रिटेंशन क्लीनअप को डेटाबेस स्तर पर सक्षम करने की आवश्यकता होती है:

ALTER DATABASE CURRENT

जाओ पर TEMPORAL_HISTORY_RETENTION सेट करें

फिर प्रति तालिका प्रतिधारण अवधि निर्धारित करें:

ALTER TABLE dbo.Employee

SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 90 DAYS));

यह हिस्ट्री टेबल में मौजूद 90 दिनों से पुराने सभी डेटा को डिलीट कर देगा। SQL सर्वर 2016 ऑन-प्रिमाइसेस डेटाबेस TEMPORAL_HISTORY_RETENTION और HISTORY_RETENTION_PERIOD का समर्थन नहीं करते हैं और उपरोक्त दोनों क्वेरीज़ SQL Server 2016 ऑन-प्रिमाइसेस डेटाबेस पर निष्पादित की जाती हैं, तो निम्न त्रुटियाँ उत्पन्न होंगी।

TEMPORAL_HISTORY_RETENTION के लिए त्रुटि होगी:

Msg 102, Level 15, State 6, Line 34

'TEMPORAL_HISTORY_RETENTION' के पास गलत सिंटैक्स।

HISTORY_RETENTION_PERIOD त्रुटि होगी:

Msg 102, Level 15, State 1, Line 39

'HISTORY_RETENTION_PERIOD' के पास गलत सिंटैक्स।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow