একটি কলামে একটি সীমাবদ্ধতা (সূচক) বাদ দেওয়া হচ্ছে


12

আমি কীভাবে কোনও টেবিলের সূচক রয়েছে তার প্রকারটি সংশোধন করতে পারি? তারিখের সময় থেকে বর্ণের (15) টাইপটি সংশোধন করার জন্য আমি একটি খালি টেবিলে একটি পরিবর্তনকারী কলাম করার চেষ্টা করেছি এবং এটির কলামের উপর নির্ভরতা রয়েছে (এটি সূচক হিসাবে প্রমাণিত হয়েছিল) বলে ত্রুটি পেয়েছি।

আমি সূচককে ডান ক্লিক করে এবং একটি ড্রপ স্ক্রিপ্ট করে সহজেই এটিকে ঘিরে ফেলতে সক্ষম হয়েছি, তবে অন্যান্য সার্ভারে আমার এটি রোল করা দরকার যেখানে আমার সূচীর নামটি অ্যাক্সেস পাবে না।

আমি কি এমন কোনও স্ক্রিপ্ট তৈরি করতে পারি যা কোনও সূচককে ফেলে দেবে, আমাকে কলামে সেই ডাটাটাইপ পরিবর্তন করার পরে সূচিটি পড়তে দিন? ধন্যবাদ!

উত্তর:


7

আপনি সূচী পেতে sys.indexes ভিউ ব্যবহার করতে পারেন। গতিশীল ড্রপ সূচক তৈরির জন্য তথ্য পেতে আপনি এই টেবিলটিতে sys.tables, sys.colলাম এবং sys.index_column এ যোগ দিতে পারেন। আপনার ড্রপ সূচকটি তৈরি করতে আপনি এই সাধারণ নির্বাচনটি ব্যবহার করতে পারেন। আপনি সারণী এবং কলামগুলি ফিল্টার করার জন্য যেখানে ক্লজটি ব্যবহার করতে পারেন। আপনি যদি টেবিল 1 পরিবর্তন করতে চান। কলাম 1 আপনার সঠিক নাম মোছার বিবৃতি পেতে নির্বাচন ফিল্টার করতে অবশ্যই সেই নামগুলি ব্যবহার করতে হবে

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

যে কোনও কলাম পরিবর্তন করতে, প্রথমে আপনাকে সূচী বা অন্য কোনও সীমাবদ্ধতা বাদ দিতে হবে যাতে সেই কলামটি রয়েছে, এবং আবার সূচি / সীমাবদ্ধতা তৈরি করার পরে create তবে এই কাজটি অবশ্যই ডিবিএ দ্বারা করা উচিত কারণ সূচী বা সীমাবদ্ধতার যে কোনও ড্রপ ডেটা অনুসন্ধানের ক্ষেত্রে একদিকে প্রভাব ফেলবে - যখন সূচকটি বাদ পড়ে এবং অন্যদিকে সূচি পুনরায় চালু হওয়ার সময় পুরো টেবিলে বাধা দেয়- সৃষ্টি করেছেন। আপনাকে নিশ্চিত করতে হবে যে ব্যবহারকারীরা এই সামান্য বা বড় (টেবিলের আকারের উপর নির্ভরশীল) রক্ষণাবেক্ষণ সম্পর্কে সচেতন হবে। শুভকামনা!

তবে সূচক তৈরি করা অনলাইন বিকল্পের সাহায্যে করা যেতে পারে যা কম ব্লক করা।


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 অবজেক্ট_আইডি শর্তাবলী অনুপস্থিত) এবং দরকার নেই 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
দয়া করে দেখুন আমার অ্যাকাউন্টটি কেন নিবন্ধিত করা উচিত? স্ট্যাক এক্সচেঞ্জ FAQ এ।
পল হোয়াইট 9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.