आपका प्रश्न अनिवार्य रूप से है:
मैं अब यह जोखिम भरा काम क्यों नहीं कर सकता कि मुझे पहले कभी नहीं करने दिया जाना चाहिए था?
उस प्रश्न का उत्तर काफी हद तक अप्रासंगिक है (हालाँकि आप इस कार्यक्षमता के लिए पूछ रहे इन कनेक्ट आइटम में कुछ Microsoft टिप्पणियाँ देख सकते हैं: # 294193 और # 252226)। पूर्णता के लिए, मेरा सिनोप्सिस है: पहचान संपत्ति को हटाने की क्षमता पहले स्थान पर सिस्टम तालिकाओं के साथ गड़बड़ करने की क्षमता का एक अनपेक्षित दुष्प्रभाव था। यह कई मायनों में इस्तेमाल करने का इरादा नहीं था जो कि यह था, अक्सर बहुत खराब परिणामों के साथ, और इस तरह इसे हटा दिया गया था। यह एक अनिर्दिष्ट, असमर्थित, सिस्टम टेबल हैक था। सिस्टम टेबलों में डेटा बदलने की क्षमता इसलिए नहीं हटाई गई क्योंकि Microsoft अब यह नहीं चाहता था कि आप अपना कॉलम एक पहचान स्तंभ होने के नाते हैक कर सकें, इसे हटा दिया गया क्योंकि सिस्टम टेबलों के साथ मैकिंग करना बेहद जोखिम भरा है। पहचान की संपत्ति को हटाना अपने आप में एक विशेष रूप से लक्षित सुविधा निष्कासन नहीं था, और मैं इस दृष्टिकोण पर कभी भी पूरी तरह से भरोसा नहीं कर सकता था जब यह संभव था।
उस ने कहा, हम इस सवाल का जवाब कैसे देंगे?
मैं न्यूनतम या बिना डाउनटाइम वाले किसी स्तंभ की पहचान की संपत्ति को कैसे निकालूं?
यह आप आसानी से उपयोग कर सकते हैं ALTER TABLE ... SWITCH, एक तकनीक जो मुझे निश्चित है कि मैंने पहली बार कनेक्ट # 252226 के लिए वर्कअराउंड में अपने स्वयं के पॉल व्हाइट से सीखा है । त्वरित उदाहरण, इस सरल तालिका को देखते हुए:
CREATE TABLE dbo.Original
(
ID INT IDENTITY(1,1) PRIMARY KEY,
name SYSNAME
);
GO
INSERT dbo.Original(name) VALUES(N'foo'),(N'bar');
GO
SELECT * FROM dbo.Original;
GO
परिणाम:
ID name
-- ----
1 foo
2 bar
अब, एक शैडो टेबल बनाते हैं, और उस पर स्विच करते हैं, फिर पुरानी टेबल को छोड़ते हैं, नया नाम बदलते हैं, और फिर सामान्य गतिविधि फिर से शुरू करते हैं:
CREATE TABLE dbo.New
(
ID INT PRIMARY KEY,
name SYSNAME
);
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
ALTER TABLE dbo.Original SWITCH TO dbo.New;
DROP TABLE dbo.Original;
EXEC sys.sp_rename N'dbo.New', N'Original', 'OBJECT';
COMMIT TRANSACTION;
GO
INSERT dbo.Original(ID,name) VALUES(3,N'splunge');
UPDATE dbo.Original SET ID = 6 WHERE ID = 1;
GO
SELECT * FROM dbo.Original;
GO
परिणाम:
ID name
-- -------
2 bar
3 splunge
6 foo
अब साफ करें:
DROP TABLE dbo.Original;
यह केवल मेटाडेटा ऑपरेशन है, जिसमें कोई डेटा आंदोलन नहीं है, और केवल अन्य उपयोगकर्ताओं को ब्लॉक करेगा जबकि मेटाडेटा को अपडेट किया जा रहा है। लेकिन, वास्तव में, यह एक बहुत ही सरल उदाहरण है। यदि आपके पास विदेशी चाबियां हैं या प्रतिकृति, परिवर्तन डेटा कैप्चर, परिवर्तन ट्रैकिंग आदि जैसी अन्य सुविधाओं का उपयोग कर रहे हैं, तो आपको इस परिवर्तन को करने से पहले उनमें से कुछ को निष्क्रिय करने या निकालने की आवश्यकता हो सकती है (मैंने सभी संयोजनों का परीक्षण नहीं किया है)। विदेशी कुंजी के लिए विशेष रूप से, यह टिप देखें जो दिखाता है कि सभी प्रमुख (या चयनित) विदेशी कुंजी बाधाओं को छोड़ने और फिर से बनाने के लिए स्क्रिप्ट कैसे उत्पन्न करें।
इसके अतिरिक्त, आपको इस कॉलम को पॉप्युलेट करने के लिए SQL सर्वर की अपेक्षा नहीं करने के लिए अपने एप्लिकेशन कोड को अपडेट करना होगा, और किसी भी सम्मिलित या चयनित स्टेटमेंट की जांच करनी होगी जो कॉलम या उनके द्वारा निर्दिष्ट किए जाने वाले कॉलम के आदेश पर निर्भर हो सकता है। आम तौर पर, मैं इस तालिका के किसी भी उल्लेख के लिए आपका पूरा कोड आधार तैयार करूंगा।
इत्ज़िक बेन-गण (स्रोत: यह प्राचीन लेख ) से इस स्क्रिप्ट को देखने के लिए इसे संभालने का एक और तरीका है, लेकिन यहां डेटा आंदोलन शामिल है, इसलिए यह "नहीं या न्यूनतम डाउनटाइम" आवश्यकता को पूरा नहीं करता है।