কেন কলামে পরিচয় সম্পত্তি অপসারণ করা সমর্থিত নয়


11

আমি পড়েছি যে এসকিউএল সার্ভার 2000 পরে, একটি পরিচয় কলাম "আন-পরিচয়" সরিয়ে দেওয়ার ক্ষমতা সরিয়ে দেওয়া হয়েছিল। এবং এটি ছিল "বাই ডিজাইন" (কেবল অনুপস্থিত বৈশিষ্ট্য নয়)।

এখানে আমি একটি ব্লগে পাওয়া একটি উদাহরণ । এটিতে সিস্টেম সারণী আপডেট করা জড়িত। (এবং এসকিউএল সার্ভার 2000 এর পরে সেই ক্ষমতাটি সরিয়ে দেওয়া হয়েছিল)) আমি বুঝতে পারি যে সিস্টেম টেবিলের মাধ্যমে এটি করা ভাল ধারণা নয়। আমি কেবল ভাবছি কেন অন্য কোনও উপায়ে এটি করার বৈশিষ্ট্যটি প্রায় নেই।

এই চারপাশে কাজ করা আমার জন্য যথেষ্ট পরিমাণে কাজ ঘটাচ্ছে। (ডাউনটাইম অসহিষ্ণু পরিবেশে নতুন কয়েক সারণীতে কয়েক মিলিয়ন সারি অনুলিপি করা হচ্ছে))

তাই আমি ভেবেছিলাম আমি "কেন" জিজ্ঞাসা করব।

এসকিএল সার্ভার ২০০৫ এবং পরবর্তী সংস্করণগুলিতে কী এমন পরিবর্তন হয়েছে যা এটিকে খারাপ জিনিস হিসাবে ফেলেছে? বা এটি সবসময় খারাপ ছিল, এবং কেবল লক করা হয়নি?

কোন "সেরা অনুশীলন" (বা অনুরূপ নীতি) কোনও পরিচয় কলামকে আবার একটি সাধারণ কলাম তৈরি করে লঙ্ঘন করা হবে?

-

"কেন আমি এটি করছি" এর অনুরোধের জবাব দিতে আপডেট করুন:
এটি একটি উচ্চ স্তরের সংক্ষিপ্তসার: আমি আমার টেবিলগুলিতে পার্টিশন যুক্ত করা শুরু করব। (যাতে আমি পুরানো ডেটা সংরক্ষণ / সংরক্ষণ করতে পারি)) এটি সহজ। তবে মাঝে মাঝে আমার রেকর্ডটি অন্য একটি পার্টিশনে স্থানান্তর করতে হবে যাতে এটি মুছে ফেলা না হয় (যখন কোনও পার্টিশন সংরক্ষণাগার / মোছার জন্য আসে)) (আমি আমার পার্টিশন কলামটি 2 টি বাড়িয়ে চলেছি যাতে সারিটি অন্য একটি পার্টিশনে সরানোর জন্য সর্বদা স্থান থাকে))

পার্টিশন কলামটি যদি একটি পরিচয় কলাম হয়, তবে আমাকে মানটি মুছতে হবে এবং পুনরায় সন্নিবেশ করতে হবে (কোনও পরিচয় কলামের মান আপডেট করার কোনও উপায় নেই)। যা প্রতিলিপি নিয়ে সমস্যা সৃষ্টি করে।

সুতরাং আমি একটি পরিচয় কলামের পরিবর্তে একটি ক্রম ব্যবহার করতে চাই। তবে বড় ডাটাবেসে সেই স্যুইচটি খুব শক্ত।

উত্তর:


22

আপনার প্রশ্নটি মূলত:

আমি কেন এই ঝুঁকিপূর্ণ কাজটি আর করতে পারি না যা আমাকে প্রথমে করার অনুমতি দেওয়া উচিত ছিল না?

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

অতিরিক্তভাবে, এসকিউএল সার্ভারটি এই কলামটি তৈরি করবে এমন প্রত্যাশা না করার জন্য আপনার অ্যাপ্লিকেশন কোডটি আপডেট করতে হবে এবং যে কোনও সন্নিবেশ পরীক্ষা করতে হবে বা কলামগুলি বা তাদের যে কলামগুলি নির্দিষ্ট করার প্রয়োজন হবে তার ক্রম অনুসারে নির্বাচন করতে হবে তা নির্বাচন করুন। সাধারণত, আমি এই টেবিলের যে কোনও উল্লেখের জন্য আপনার পুরো কোড বেসটি গ্রেপ করব।

এটি পরিচালনা করার অন্য উপায়ের জন্য ইতজিক বেন-গান (উত্স: এই প্রাচীন নিবন্ধ ) থেকে এই স্ক্রিপ্টটি দেখুন , তবে এখানে ডেটা আন্দোলন জড়িত রয়েছে, সুতরাং এটি "না বা সর্বনিম্ন ডাউনটাইম" প্রয়োজনীয়তা সরবরাহ করে না।


3
আমি দুটি সংযোগ আইটেম upvote জন্য আসা যে কেউ উত্সাহিত করতে চাই। অ্যালটার কালাম বৈশিষ্ট্যটি কার্যকর করা সম্ভব হবে যা পরিচয় বুলিয়ান চালু বা বন্ধ করে দেয় ?! চারপাশে কাজ করা বেদনাদায়ক।
usr ডিরেক্টরির

আমাকে স্বীকার করতে হবে, কোনও কারণে আমি ভেবেছিলাম যে ..SWITCH..কেবলমাত্র টেবিলগুলির জন্যই কাজ করেছেন যা কমপক্ষে একটি বিভাজনকে সংজ্ঞায়িত করেছে।
আরবেরি ইয়ং

কেবল যুক্ত করতে চান যা SWITCHএন্টারপ্রাইজ সংস্করণের প্রয়োজন হয় না, যদিও সারণী বিভাজন করে।
ড্যান গুজম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.