करते समय एक्सेस अवरुद्ध करना मुझे एक टेबल को ड्रॉप और फिर से बनाना होगा, जो एक महंगे दृश्य को "कैश" करने के लिए मौजूद है। दृश्य बदल सकता है और मैं रखरखाव को यथासंभव आसान बनाना चाहता हूं, इसलिए मैं नई तालिका को दृश्य के नवीनतम संस्करण को प्रतिबिंबित करना चाहता हूं।एसक्यूएल सर्वर - ड्रॉप और एक टेबल को मनोरंजन करें -
मैं भी पढ़ने की त्रुटियों को रोकने में सक्षम होना चाहता हूं, प्रक्रिया को तालिका तक पहुंचने का प्रयास करना चाहिए, जबकि इसे छोड़ने और फिर से बनाने के बीच में है। मैं एक लेनदेन का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि क्या वह उस विभाजित दूसरे के लिए 'गिराए गए' टेबल पर काम करेगा, जो अस्तित्व में नहीं है।
मैंने ड्रॉप/रीवेट व्यू चलाने के दौरान एक लूप में दृश्य से 30 x चयन किया है। अब तक कोई त्रुटि नहीं है।
मैंने डालने के साथ एक ट्रंकेट/हटाया है, लेकिन भविष्य में संभावित रूप से देखने वाले संभावित कॉलमों की आवश्यकता है कि मैं इसे यथासंभव लचीला रखूं, और निश्चित कॉलम इससे मदद नहीं करेंगे।
क्या कोई मुझे बता सकता है कि क्या लेनदेन गिराए जाने पर तालिका को पढ़ने के उपयोग से सुरक्षित रखेगा और यह सुरक्षित है, या यदि कोई बेहतर तरीका है?
ड्रॉप/बहलाना कोड:
BEGIN TRAN
BEGIN TRY
DROP TABLE Persisted_View_1
SELECT * INTO Persisted_View_1
FROM View_1
END TRY
BEGIN CATCH
RAISERROR('The procedure proc_PersistView1 failed to commit, the transaction was rolled back', 16, 1)
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
END
GO
अद्यतन: संशोधित क्वेरी निम्नलिखित Brads उत्तर:
ALTER PROCEDURE proc_Drop_Recreate_Persisted_View_MyData
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
BEGIN TRY
-- Re create
SELECT * INTO Persisted_View_MyData_Temp FROM View_MyData
-- Create index on product ID
CREATE CLUSTERED INDEX [IX_ProductID_ProductTypeID] ON [dbo].[Persisted_View_MyData_Temp]
(
[productID] ASC,
[productTypeID] ASC
)
WITH
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
-- Check and drop table
IF EXISTS (SELECT Id FROM sysObjects WHERE Name like 'Persisted_View_MyData')
BEGIN
DROP TABLE Persisted_View_MyData
END
EXEC sp_rename 'Persisted_View_MyData_Temp', 'Persisted_View_MyData'
END TRY
BEGIN CATCH
RAISERROR('The procedure proc_PersistViewMyData failed to commit, the transaction was rolled back', 16, 1)
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRAN
END
END CATCH
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRAN
END
END
इस मैन्युअल कैशिंग तालिका का उपयोग करने के बजाय, क्या आप इसे अनुक्रमित दृश्य बनाकर दृश्य को पूरा कर सकते हैं? फिर एसक्यूएल को आपके लिए इन सभी विवरणों का ख्याल रखना चाहिए। (ध्यान दें कि दृश्य में कुछ संरचनाएं इसे रद्द कर सकती हैं, जैसे यूनियन या ग्रुप बीईएस) – BradC
@ ब्रैडसी, क्या आप "अनुक्रमित दृश्य" को देखने के तरीके पर और टिप्पणी कर सकते हैं? – Brad
@ ब्रैड ने मेरी टिप्पणी को एक उत्तर में विस्तारित किया। निचे देखो। – BradC