2016-11-09 3 views
7

मेरे पास डेटा के साथ कई टेबल हैं, जिन्हें मैं माइक्रोसॉफ्ट टेम्पोरल टेबल में कनवर्ट करना चाहता हूं, लेकिन जब मैं अस्थायी तालिका को परिवर्तित करना चाहता हूं तो मेरा डेटा खो गया है। मेरे कोड है:डेटा रखने के द्वारा एसक्यूएल टेम्पोरल टेबल में अस्तित्व सारणी कैसे बदल सकते हैं?

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

कैसे डेटा रखकर Sql अस्थायी तालिका में अस्तित्व टेबल बदल सकते हैं?

उत्तर

2

सबसे पहले आपको किसी भी तालिका में सिस्टम समय अवधि के लिए दो कॉलम जोड़ना चाहिए। इस तरह:

CREATE TABLE DepartmentHistory 
( 
    DeptID int NOT NULL 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL 
); 
GO 
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory 
    ON DepartmentHistory; 
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS 
    ON DepartmentHistory (SysEndTime, SysStartTime, DeptID); 
GO 
CREATE TABLE Department 
( 
    DeptID int NOT NULL PRIMARY KEY CLUSTERED 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL   
) ; 

ऊपर कोड में, SysStartTime और SysEndTime प्रणाली अवधि समय कॉलम शामिल हैं। यदि आप अस्थायी तालिका है और आप तालिकाओं स्कीमा संपादित करना चाहते हैं

ALTER TABLE dbo.Department 
    ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]) 
ALTER TABLE dbo.Department  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON)); 

और, है, तो आप इस कोड से यह कर सकते हैं:

उसके बाद आप उन्हें अस्थायी तालिकाओं के लिए आसानी से परिवर्तित कर सकते हैं

ALTER TABLE Test.dbo.Department 
    SET (SYSTEM_VERSIONING = OFF) 
5
  1. अपनी अस्थायी तालिका बनाएं।

  2. अपनी मूल तालिका से डेटा को अस्थायी तालिका में डालें।

  3. अपनी मूल तालिका ड्रॉप करें।

+1

मेरे पास कई तालिकाओं की संख्या 100 टेबल हो सकती है और मुझे लगता है कि इस तरह हर समय सभी तालिकाओं के लिए प्रयोग योग्य नहीं है। आपके उत्तर के लिए धन्यवाद। –

1

दो चरणों में कर्मचारी तालिका में सिस्टम संस्करण पर बारी

  1. नई अवधि कॉलम (छिपे)
  2. बनाने डिफ़ॉल्ट इतिहास तालिका

    ALTER TABLE Employee 
    ADD 
    ValidFrom datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN  
        constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME()) 
    , ValidTo datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN  
        constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99' 
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo); 
    
    ALTER TABLE Employee  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employee_History)); 
    

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

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