एक स्तंभ पर एक बाधा (सूचकांक) को गिराना


12

मैं उस तालिका पर प्रकार को कैसे संशोधित कर सकता हूं जिस पर एक सूचकांक है? मैंने एक खाली मेज पर एक परिवर्तन स्तंभ करने की कोशिश की, ताकि तारीख के समय से varchar (15) को संशोधित किया जा सके और यह कहते हुए त्रुटियां हुईं कि इसमें स्तंभ पर निर्भरताएं थीं (जो अनुक्रमित हो गईं)।

मैं इंडेक्स को राइट क्लिक करके और ड्रॉप की स्क्रिप्टिंग करके स्थानीय रूप से इसे आसानी से प्राप्त करने में सक्षम था, लेकिन मुझे इसे अन्य सर्वर पर रोल आउट करने की आवश्यकता है जहां मुझे इंडेक्स नाम तक पहुंच नहीं होगी।

क्या कोई ऐसा तरीका है जिससे मैं कोई स्क्रिप्ट बना सकता हूं, जो किसी भी इंडेक्स को छोड़ देगा, मुझे उस डेटाटाइप को कॉलम पर बदलना होगा फिर इंडेक्स को पढ़ना होगा? धन्यवाद!

जवाबों:


7

आप अनुक्रमित करने के लिए sys.indexes दृश्य का उपयोग कर सकते हैं। डायनामिक ड्रॉप इंडेक्स बनाने के लिए informations प्राप्त करने के लिए आप इस तालिका में sys.tables, sys.columns और sys.index_column से जुड़ सकते हैं। आप अपने ड्रॉप इंडेक्स को जेनरेट करने के लिए इस सरल चयन का उपयोग कर सकते हैं। आप टेबल और कॉलम को फ़िल्टर करने के लिए जहाँ क्लॉज़ का उपयोग कर सकते हैं। यदि आप Table1.Column1 को बदलना चाहते हैं, तो आपको सही डिलीट स्टेटमेंट प्राप्त करने के लिए चयन को फ़िल्टर करने के लिए उन नाम का उपयोग करना चाहिए

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go

आशा है कि यह आपकी मदद करेगा


3
जब आप जुड़ते हैं तो idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id के साथ जुड़ने वाले बयानों को समृद्ध करना चाहिए और समूह बनाने की कोई आवश्यकता नहीं है।
बैक्स

2

किसी भी कॉलम को बदलने के लिए, सबसे पहले आपको इंडेक्स या किसी अन्य बाधा को छोड़ना होगा, जिसमें वह कॉलम हो, और उसके बाद फिर से इंडेक्स / बाधा उत्पन्न करें। लेकिन यह कार्य एक डीबीए द्वारा किया जाना चाहिए क्योंकि सूचकांक या बाधा पर कोई भी गिरावट एक ओर डेटा को प्रभावित करेगी - जबकि सूचकांक गिरा दिया जाता है, और दूसरी तरफ सूचकांक फिर से उस समय के लिए पूरी मेज पर रुकावट डालते हैं- बनाया था। आपको यह सुनिश्चित करने की आवश्यकता है कि उपयोगकर्ता इस छोटे या बड़े (तालिका आकार पर निर्भर) रखरखाव से अवगत होंगे। सौभाग्य!

हालाँकि इंडेक्स क्रिएट ऑनलाइन विकल्प के साथ किया जा सकता है जो कम अवरुद्ध है।


0

यदि आप पहले इंडेक्स को गिराते हैं, तो आप इसे फिर से नहीं पढ़ पाएंगे, जब तक कि इंडेक्स को दोबारा बनाया नहीं जाता है। बाधा के प्रवर्तन को अक्षम करने के लिए आप क्या कर सकते हैं।

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

इस स्क्रिप्ट के चलने के बाद, बाधा को लागू नहीं किया जाएगा, और आप बाधा जाँच के बारे में चिंता किए बिना डेटा दर्ज कर सकते हैं। आप बाधाओं को फिर से सक्षम करने के लिए, तालिका को फिर से बदल सकते हैं।

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

पिछले किसी भी उल्लंघन की जाँच या सुधार नहीं किया जाएगा, लेकिन बाधा के लागू होने के बाद किसी भी प्रविष्टि की जाँच की जाएगी।


-2

निको के उत्तर में 2 गलतियां हैं (2 ऑब्जेक्ट_ड मिसिंग)। और कोई आवश्यकता नहीं है group by:

SELECT  @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM    sys.indexes             idx 
INNER JOIN sys.tables           tbl     ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns    idxCol  ON idx.index_id = idxCol.index_id   AND idx.object_id = idxCol.object_id 
INNER JOIN sys.columns          col     ON idxCol.column_id = col.column_id AND  idxCol.object_id = col.object_id
WHERE   idx.type <> 0 
AND     tbl.name = 'file_transfer_log' 
AND     col.name = 'tender_id';

1
कृपया देखें कि मुझे अपना खाता क्यों पंजीकृत करना चाहिए? स्टैक एक्सचेंज में अक्सर पूछे जाने वाले प्रश्न।
पॉल व्हाइट 9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.