जिस तरह से मैंने इसे कुछ परियोजनाओं में किया है वह अलग-अलग स्कीमा में तालिका की दो प्रतियों का उपयोग करना है। तो कुछ इस तरह:
CREATE SCHEMA fake WITH AUTHORIZATION dbo;
CREATE SCHEMA standby WITH AUTHORIZATION dbo;
GO
CREATE TABLE dbo.mySummary(<...columns...>);
CREATE TABLE fake.mySummary(<...columns...>);
GO
अब एक संग्रहीत कार्यविधि बनाएं जो नकली तालिका को काटती है और फिर से भरती है, फिर लेन-देन में वस्तुओं को स्कीमा के बीच ले जाती है।
CREATE PROCEDURE dbo.SwapInSummary
AS
BEGIN
SET NOCOUNT ON;
TRUNCATE TABLE fake.mySummary;
INSERT fake.mySummary(<...columns...>)
SELECT <expensive query>;
BEGIN TRANSACTION;
ALTER SCHEMA standby TRANSFER dbo.mySummary;
ALTER SCHEMA dbo TRANSFER fake.mySummary;
ALTER SCHEMA fake TRANSFER standby.mySummary;
COMMIT TRANSACTION;
END
GO
यह संभवत:कम से कम समय के बारे में है जिससे आप उपयोगकर्ताओं को नए डेटा के ताज़ा होने की प्रतीक्षा कर सकते हैं और उन्हें पढ़ने के बीच में बाधित किए बिना। (नोलॉक से जुड़े कई मुद्दे हैं जो इसे कम वांछनीय विकल्प बनाते हैं, हालांकि स्वीकार्य रूप से, कोड करना आसान है।) संक्षिप्तता/स्पष्टता के लिए मैंने त्रुटि प्रबंधन इत्यादि छोड़ दिया है, और मुझे यह भी इंगित करना चाहिए कि यदि आप उपयोग करते हैं अपने डेटाबेस को सिंक्रोनाइज़ करने के लिए स्क्रिप्ट, सुनिश्चित करें कि आप दोनों टेबलों पर बाधाओं, इंडेक्स आदि का नाम समान रखते हैं, अन्यथा आप आधे समय में सिंक से बाहर हो जाएंगे। प्रक्रिया के अंत में आप नई नकली। MySummary तालिका को TRUNCATE कर सकते हैं, लेकिन यदि आपके पास जगह है, तो मैं डेटा को वहीं छोड़ना चाहता हूं ताकि मैं हमेशा पिछले संस्करण से तुलना कर सकूं।
SQL सर्वर 2005 से पहले मैंने ठीक उसी काम को पूरा करने के लिए लेन-देन के अंदर sp_rename का उपयोग किया था, हालांकि जब से मैं इसे नौकरी में करता हूं, मुझे स्कीमा में स्विच करने में खुशी हुई, क्योंकि जब मैंने किया, तो sp_rename से गैर-दबाने योग्य चेतावनी भरना बंद कर दिया मेरे SQL सर्वर एजेंट इतिहास लॉग को ऊपर करें।