এসকিউএল সার্ভারের সাহায্যে আমি কীভাবে ক্যাসকেড মুছব?


332

আমার কাছে দুটি টেবিল রয়েছে: টি 1 এবং টি 2, এগুলি ডেটা সহ বিদ্যমান সারণী। টি 1 এবং টি 2 এর মধ্যে আমাদের অনেকের মধ্যে একটির সম্পর্ক রয়েছে। এসকিউএল সার্ভারে ক্যাসকেডিং মুছতে সম্পাদনের জন্য আমি টেবিলের সংজ্ঞা কীভাবে পরিবর্তন করব যখন টি 1 থেকে একটি রেকর্ড মুছে ফেলা হয়, টি 2-র সাথে সম্পর্কিত সমস্ত রেকর্ডও মুছে ফেলা হয়।

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

টি 1 - কর্মচারী,

Employee ID      
Name
Status

টি 2 - পারফরম্যান্স পর্যালোচনা,

Employee ID - 2009 Review
Employee ID - 2010 Review

উত্তর:


362

তোমার দরকার হবে,

  • বিদ্যমান বিদেশী কী বাধা ফেলে দিন,
  • ON DELETE CASCADEসক্ষম হওয়া সেটিং সহ একটি নতুন যুক্ত করুন ।

কিছুটা এইরকম:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

3
আমার দল এবং আমি সবেমাত্র এটি করেছি। আমাদের আমাদের প্রতিবন্ধকতাগুলি ড্রপ করে আবার যুক্ত করতে হয়েছিল re এটি আমাদের পক্ষে কাজ করেছিল।
ড্যানিয়েল এল ভ্যানডেনবোশ

2
এটি কীভাবে শক্ত মোছার পক্ষে? একটি নরম মোছা কখনও বাধা সমস্যা হবে না। আমার কাছে একেবারে বিপরীত মনে হচ্ছে।
ম্যাক্সেক্স

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

319

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে বিদ্যমান বিদেশী কীতে "ক্যাসকেড মোছা" যুক্ত করতে:

প্রথমে আপনার বিদেশী কী নির্বাচন করুন এবং এটি একটি নতুন ক্যোয়ারী উইন্ডোতে "ড্রপ এবং তৈরি করুন .." খুলুন।

এখানে চিত্র বর্ণনা লিখুন

তারপর, শুধু যোগ ON DELETE CASCADEকরতে ADD CONSTRAINTকমান্ড প্রয়োগ করুন:

এন এবং এই ক্যোয়ারীটি চালানোর জন্য "চালনা করুন" বোতামটি টিপুন।

যাইহোক, আপনার বিদেশী কীগুলির একটি তালিকা পেতে এবং কোনটি "ক্যাসকেড মোছা" চালু করেছে তা দেখতে আপনি এই স্ক্রিপ্টটি চালাতে পারেন:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

এবং যদি আপনি কখনই খুঁজে পান যে DROPকোনও বিদেশী কী বাধার কারণে আপনি কোনও নির্দিষ্ট টেবিল করতে পারবেন না তবে কোন এফকে সমস্যা সৃষ্টি করছে তা আপনি কাজ করতে পারেন না, তবে আপনি এই আদেশটি চালাতে পারেন:

sp_help 'TableName'

এই নিবন্ধের এসকিউএল সমস্ত এফকে তালিকাভুক্ত করেছে যা একটি নির্দিষ্ট সারণীর উল্লেখ করে।

আশা করি এই সব সাহায্য করবে।

দীর্ঘ আঙুলের জন্য দুঃখিত। আমি শুধু একটি বিষয় বলার চেষ্টা করছিলাম।


163

আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও দিয়ে এটি করতে পারেন।

The টেবিলের নকশায় ডান ক্লিক করুন এবং সম্পর্কের দিকে যান এবং বাম-পাশের ফলকে এবং ডানদিকের ফলকে বিদেশী কী চয়ন করুন, "INSERT এবং আপডেট আপডেট" মেনুটি প্রসারিত করুন এবং মোছার বিধি হিসাবে "ক্যাসকেড" নির্বাচন করুন।

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও


হাই, 4 এর মধ্যে পার্থক্য কী, ক্যাসকেড ঘুরিয়ে দেওয়া সারণীতে সমস্ত ডেটা মুছতে সহজ করে তোলে। আমি কিভাবে সব নির্ভরতা / FK কী দেখতে পারেন উপর এই টেবিল থেকে না এই টেবিল। এমনকি সব এফ কে এর আমি এখনও কোনো ত্রুটির সম্মুখীন হয়েছেন মুছে ফেলার পর
aggie

@ অ্যাগি - আপনি এর মাধ্যমে নির্ভরতাগুলি পরীক্ষা করতে পারেন - টেবিলটিতে রাইট ক্লিক করুন -> "নির্ভরতা দেখুন" এছাড়াও এসকিএল সার্ভার আপনাকে এই জাতীয় "রেফারেন্সের সীমাবদ্ধতা" এফকে_চিল্ড1_প্যারেন্ট1 "এর সাথে বিরোধী ডিলিট বিবৃতি দিয়ে টেবিলের নাম এবং কলামের নাম সহ বিশদ ত্রুটি দেবে। "TESTDB" ডাটাবেস, টেবিল "dbo.Child1", 'প্যারেন্ট 1 আইডি' কলামে দ্বন্দ্ব দেখা দিয়েছে। "
পালানীকুমার

@ অ্যাগি - এছাড়াও চতুর্থ ক্ষেত্রে "সেট ডিফল্ট" হ'ল, আপনাকে বিদেশী কী কলামে ডিফল্ট সীমাবদ্ধতা নির্ধারণ করতে হবে, যখন আমরা পিতামাতাকে মুছব তখন ডিফল্ট মানটি শিশু টেবিলে প্রতিস্থাপন করা হবে। (দ্রষ্টব্য: ডিফল্ট মান অবশ্যই প্যারেন্ট টেবিলের সাথে মেলতে হবে
পালানীকুমার

এটি খুব সহায়ক। আমি ভাবছি কেন সেখানে sertোকানোর নিয়ম নেই? অন্য কথায়, আমি যখন টি 1-এ একটি সারি যুক্ত করি, আমি চাই টি 2-তে সংশ্লিষ্ট এন্ট্রি স্বয়ংক্রিয়ভাবে তৈরি হোক।
রবার্ট এম

@RobertM। কারণ এটি কোনও বোধগম্য নয়। এটি কীভাবে জানবে যে INSERT এর মূল্য কী? আপনি বাচ্চাদের সারি তৈরির জন্য INSERT ট্রিগারগুলি ব্যবহার করতে সক্ষম হতে পারেন, এটি নিয়ে গবেষণা করার চেষ্টা করুন।
ড্যান বেচার্ড

47

এর মতো কিছু ব্যবহার করুন

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

সঠিক কলামের নামগুলি পূরণ করুন এবং আপনাকে সেট করা উচিত। চিহ্ন_গুলি সঠিকভাবে বলেছে, আপনার যদি ইতিমধ্যে কোনও বিদেশী কী বাধা থাকে তবে আপনার প্রথমে পুরানোটিকে মুছতে হবে এবং তারপরে নতুনটি তৈরি করতে হবে।


41
@মার্ক_স - আসলে, আপনি উভয় পক্ষের ঠিক একই কলামগুলির বিপরীতে একটি দ্বিতীয় বিদেশী কী যুক্ত করতে পারেন এবং এটি সঠিকভাবে কাজ করবে। কোনও ডাউনটাইম ছাড়াই উত্পাদনের পরিবেশে কাজ করা হলে, নতুন এফকে ক্যাসকেডের সাথে পরিচয় করিয়ে দেওয়া ভাল, এবং তারপরে কোনও এফকে না থাকলে টেবিলে একটি উইন্ডো না রেখে পুরানো এফকে বাদ দিন। (এসকিউএল ২০০৮-তে কেবলমাত্র পরীক্ষিত)
ড্যামিয়েন_এই_বিশ্বাসীরা

এটা সঠিক। আমি এটি চেষ্টা করেছিলাম, এবং এটি কার্যকর হয়। প্রথম বিদেশী কী বাধাগুলি ফেলে দেওয়ার দরকার নেই। জবাবের জন্য ধন্যবাদ.
বিচভান এনগুইন

15

ওএনসকেড সম্পত্তি সক্ষম করার জন্য প্রথমে:

1. বিদ্যমান বিদেশী কী সীমাবদ্ধতা ড্রপ

2. মুছে ফেলা ক্যাসকেড সেটিংস সক্ষম করে একটি নতুন যুক্ত করুন

উদা:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ওএনক্যাসেড সম্পত্তি অক্ষম করার দ্বিতীয়:

1. বিদ্যমান বিদেশী কী সীমাবদ্ধতা ড্রপ

2. মোছা কোনও অ্যাকশন সেটিংস সক্ষম সক্ষম করে একটি নতুন যুক্ত করুন

উদা:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END

15

ON DELETE CASCADE
এটি নির্দিষ্ট করে যে পিতামাতার ডেটা মুছে ফেলা হলে শিশু ডেটা মুছে ফেলা হয়।

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

এই বিদেশী কীটির জন্য, আমরা সেই ON DELETE CASCADEধারাটি নির্দিষ্ট করেছি যা এসকিউএল সার্ভারকে অভিভাবক সারণীর ডেটা মুছে ফেলা হলে শিশু টেবিলে সম্পর্কিত রেকর্ডগুলি মুছতে বলে tells সুতরাং এই উদাহরণে, যদি কোনও প্রোডাক্ট_আইডি মান পণ্য সারণি থেকে মুছে ফেলা হয় তবে ইনভেন্টরি টেবিলের সাথে সম্পর্কিত যে রেকর্ডগুলি এই পণ্য_আইডি ব্যবহার করে তাও মুছে ফেলা হবে।


-2

যদি অনেকগুলি সম্পর্কের সাথে একটির সম্পর্ক টি 1 থেকে টি 2 হয় তবে এটি কোনও ফাংশনকে উপস্থাপন করে না এবং তাই কোনও বিপরীত ফাংশন অনুমান বা অনুমান করতে ব্যবহার করা যাবে না যা ফলাফলের টি 2 মান টি 2 এর টিপলকে বাদ দিতে পারে না এমন টি 2 এর যোগান ছাড়াই বৈধ , কারণ কোনও ছাড়যোগ্য বৈধ ইনভার্স ফাংশন নেই। (ফাংশনগুলি উপস্থাপন করা ছিল প্রাথমিক কীগুলির উদ্দেশ্য।) এসকিউএল এর উত্তর মনে করে হ্যাঁ আপনি এটি করতে পারেন। রিলেশনাল ভাবার উত্তরটি হ'ল আপনি এটি করতে পারবেন না। ১৯ 1970০ এর কোডডে অস্পষ্টতার বিষয়গুলি দেখুন। টি -২ থেকে টি -২ পর্যন্ত সম্পর্কটি একাধিক হতে হবে।


-10

আমি মনে করি আপনি কেবল টেবিলের সম্পত্তি মুছতে পারবেন না এটি যদি প্রকৃত উত্পাদন ডেটা হয় তবে কেবল সারণী স্কিমাকে প্রভাবিত করে না এমন সামগ্রীগুলি মুছুন।

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