समर्थित नहीं कॉलम पर पहचान संपत्ति क्यों निकाल रहा है


11

मैंने पढ़ा है कि SQL Server 2000 के बाद, एक पहचान कॉलम "संयुक्त राष्ट्र की पहचान" की क्षमता को हटा दिया गया था। और यह था कि "बाय डिजाइन" (न केवल एक लापता सुविधा)।

यहाँ एक उदाहरण मुझे एक ब्लॉग पर मिला है । इसमें सिस्टम टेबल को अपडेट करना शामिल है। (और SQL Server 2000 के बाद उस क्षमता को हटा दिया गया था।) मुझे लगता है कि सिस्टम टेबल के माध्यम से ऐसा करना एक अच्छा विचार नहीं है। मैं बस सोच रहा हूं कि ऐसा करने का फीचर दूसरा तरीका क्यों नहीं है।

इसके आसपास काम करने से मुझे काफी मात्रा में काम करना पड़ रहा है। (डाउनटाइम असहिष्णु वातावरण में कई सैकड़ों लाखों पंक्तियों को नई तालिकाओं में कॉपी करना।)

इसलिए मैंने सोचा कि मैं "क्यों" पूछूंगा।

Sql Server 2005 और बाद के संस्करणों में क्या बदलाव आया जिसने इसे एक बुरी चीज बना दिया? या यह हमेशा खराब था, और बस बंद नहीं हुआ?

पहचान स्तंभ को फिर से एक सामान्य स्तंभ बनाकर "सर्वश्रेष्ठ अभ्यास" (या समान सिद्धांत) का क्या उल्लंघन होगा?

-

"मैं ऐसा क्यों कर रहा हूं" के अनुरोध का उत्तर देने के लिए अपडेट करें:
यह एक उच्च स्तरीय सारांश है: मैं अपनी तालिकाओं में विभाजन जोड़ना शुरू करने जा रहा हूं। (ताकि मैं पुराने डेटा को संग्रह / शुद्ध कर सकूं।) यह सब आसान है। लेकिन मुझे कभी-कभी एक रिकॉर्ड को एक अलग विभाजन में स्थानांतरित करने की आवश्यकता होती है, इसलिए इसे हटाया नहीं जाता है (जब एक संग्रह अभिलेखीय / विलोपन के लिए आता है)। (मैं अपने विभाजन कॉलम को 2 से बढ़ा रहा हूं ताकि पंक्ति को किसी भिन्न विभाजन में स्थानांतरित करने के लिए हमेशा जगह हो।)

लेकिन अगर विभाजन स्तंभ एक पहचान स्तंभ है, तो मुझे मूल्य को हटाना और फिर से डालना होगा (पहचान स्तंभ के मूल्य को अपडेट करने का कोई तरीका नहीं है)। जो प्रतिकृति के साथ समस्याओं का कारण बनता है।

इसलिए मैं पहचान स्तंभ के बजाय एक अनुक्रम का उपयोग करना चाहता हूं। लेकिन बड़े डेटाबेस पर वह स्विच बहुत कठिन है।

जवाबों:


22

आपका प्रश्न अनिवार्य रूप से है:

मैं अब यह जोखिम भरा काम क्यों नहीं कर सकता कि मुझे पहले कभी नहीं करने दिया जाना चाहिए था?

उस प्रश्न का उत्तर काफी हद तक अप्रासंगिक है (हालाँकि आप इस कार्यक्षमता के लिए पूछ रहे इन कनेक्ट आइटम में कुछ 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 सर्वर की अपेक्षा नहीं करने के लिए अपने एप्लिकेशन कोड को अपडेट करना होगा, और किसी भी सम्मिलित या चयनित स्टेटमेंट की जांच करनी होगी जो कॉलम या उनके द्वारा निर्दिष्ट किए जाने वाले कॉलम के आदेश पर निर्भर हो सकता है। आम तौर पर, मैं इस तालिका के किसी भी उल्लेख के लिए आपका पूरा कोड आधार तैयार करूंगा।

इत्ज़िक बेन-गण (स्रोत: यह प्राचीन लेख ) से इस स्क्रिप्ट को देखने के लिए इसे संभालने का एक और तरीका है, लेकिन यहां डेटा आंदोलन शामिल है, इसलिए यह "नहीं या न्यूनतम डाउनटाइम" आवश्यकता को पूरा नहीं करता है।


3
मैं दो कनेक्ट आइटम्स को अपवोट करने के लिए आने वाले किसी को भी प्रोत्साहित करना चाहूंगा। ALTER COLUMN फीचर को लागू करना कितना कठिन हो सकता है जो पहचान बूलियन को चालू या बंद कर देता है ?! चारों ओर काम करने के लिए दर्दनाक।
usr

मुझे स्वीकार करना होगा, किसी कारण से मैंने सोचा था कि ..SWITCH..केवल उन तालिकाओं के लिए काम किया था जिनमें कम से कम एक विभाजन परिभाषित था।
RBarryYoung

बस जोड़ना चाहते हैं कि SWITCHएंटरप्राइज़ संस्करण की आवश्यकता नहीं है, हालांकि तालिका विभाजन करता है।
डैन गुज़मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.