আপনার প্রশ্নটি মূলত:
আমি কেন এই ঝুঁকিপূর্ণ কাজটি আর করতে পারি না যা আমাকে প্রথমে করার অনুমতি দেওয়া উচিত ছিল না?
এই প্রশ্নের উত্তরটি মূলত অপ্রাসঙ্গিক (যদিও আপনি এই ক্রিয়াকলাপের জন্য জিজ্ঞাসা করে এই কানেক্ট আইটেমগুলিতে কিছু মাইক্রোসফ্ট মন্তব্য দেখতে পারেন: # 294193 এবং # 252226)। সম্পূর্ণতার জন্য, আমার সংক্ষিপ্তসারটি হ'ল: পরিচয় সম্পত্তি অপসারণের ক্ষমতাটি প্রথমে সিস্টেম টেবিলগুলির সাথে গোলযোগ করার ক্ষমতা থাকার একটি অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া ছিল। এটি প্রায়শই খুব খারাপ পরিণতি সহ যেভাবে ঘটেছিল এটি ব্যবহার করার উদ্দেশ্যে নয় এবং তাই এটি সরানো হয়েছিল। এটি একটি অনিবন্ধিত, অসমর্থিত, সিস্টেম টেবিল হ্যাক ছিল। সিস্টেম টেবিলগুলিতে ডেটা পরিবর্তন করার ক্ষমতা অপসারণ করা হয়নি কারণ মাইক্রোসফ্ট আপনাকে আর পরিচয় কলাম বলে কলাম থেকে বেরিয়ে আপনার পথ হ্যাক করতে চায়নি, এটি সরানো হয়েছে কারণ সিস্টেম টেবিলগুলির সাথে শোক করা অত্যন্ত ঝুঁকিপূর্ণ। পরিচয় বৈশিষ্ট্যটি নিজেই মুছে ফেলা কোনও নির্দিষ্ট লক্ষ্যযুক্ত বৈশিষ্ট্য অপসারণ ছিল না এবং এটি সম্ভব হওয়ার পরেও আমি কখনই এই পদ্ধতির পুরোপুরি বিশ্বাস করতে পারিনি।
এটি বলেছিল, পরিবর্তে আমরা কীভাবে এই প্রশ্নের উত্তর দেব?
নূন্যতম বা কোনও ডাউনটাইম সহ আমি কীভাবে কোনও কলামের আইডেন্টিটি সম্পত্তি সরিয়ে দেব?
এই আপনি সহজেই করতে পারেন ব্যবহার 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;
এটি কেবলমাত্র কোনও মেটাডেটা অপারেশন, কোনও ডেটা চলাচল ছাড়াই, এবং মেটাডেটা আপডেট হওয়ার সময় কেবলমাত্র অন্যান্য ব্যবহারকারীকেই ব্লক করে দেবে। তবে, স্বীকার করেছেন, এটি খুব সরল উদাহরণ istic আপনার যদি বিদেশী কী থাকে বা অন্যান্য বৈশিষ্ট্য যেমন অনুলিপি, পরিবর্তন ডেটা ক্যাপচার, পরিবর্তন ট্র্যাকিং ইত্যাদি ব্যবহার করে থাকেন তবে এই পরিবর্তনটি করার আগে আপনাকে কিছু অক্ষম করতে বা মুছে ফেলার প্রয়োজন হতে পারে (আমি সমস্ত সংমিশ্রণ পরীক্ষা করে দেখিনি)। বিদেশী কীগুলির জন্য বিশেষভাবে, এই টিপটি দেখুন যা দেখায় যে কীভাবে সমস্ত (বা নির্বাচিত) বিদেশী কী সীমাবদ্ধতাগুলি ড্রপ এবং পুনরায় তৈরি করতে স্ক্রিপ্টগুলি তৈরি করতে পারে।
অতিরিক্তভাবে, এসকিউএল সার্ভারটি এই কলামটি তৈরি করবে এমন প্রত্যাশা না করার জন্য আপনার অ্যাপ্লিকেশন কোডটি আপডেট করতে হবে এবং যে কোনও সন্নিবেশ পরীক্ষা করতে হবে বা কলামগুলি বা তাদের যে কলামগুলি নির্দিষ্ট করার প্রয়োজন হবে তার ক্রম অনুসারে নির্বাচন করতে হবে তা নির্বাচন করুন। সাধারণত, আমি এই টেবিলের যে কোনও উল্লেখের জন্য আপনার পুরো কোড বেসটি গ্রেপ করব।
এটি পরিচালনা করার অন্য উপায়ের জন্য ইতজিক বেন-গান (উত্স: এই প্রাচীন নিবন্ধ ) থেকে এই স্ক্রিপ্টটি দেখুন , তবে এখানে ডেটা আন্দোলন জড়িত রয়েছে, সুতরাং এটি "না বা সর্বনিম্ন ডাউনটাইম" প্রয়োজনীয়তা সরবরাহ করে না।