মোছা বিবৃতিটি রেফারেন্সের সীমাবদ্ধতার সাথে সাংঘর্ষিক


11

আমি সমস্ত ব্যবহারকারী মুছে ফেলার চেষ্টা করছি তবে ত্রুটিটি পেয়েছি:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'.
The statement has been terminated.

ক্যোয়ারী:

DELETE FROM [workdemo.no].[dbo].[M06Persons] 
WHERE ID > '13'
GO

মনে হচ্ছে আমার ব্যবহার করা দরকার on delete cascade;তবে আমি আটকে আছি।

উত্তর:


18

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

এখন গিয়ে সেই ব্যক্তির সাথে কথা বলুন যিনি স্কিমাটি ডিজাইন করেছিলেন এবং সীমাবদ্ধতাগুলি জানেন এবং সঠিকভাবে এবং সঠিকভাবে এবং ডাটাবেসকে সামঞ্জস্য রাখতে সঠিক সতর্কতা অবলম্বন করার জন্য আপনি যে রেকর্ডগুলি মুছতে চান সেটি সঠিকভাবে কীভাবে মুছবেন তা তাকে জিজ্ঞাসা করুন।


9

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

ALTER TABLE [workdemo.no].[dbo].[M06Persons] NOCHECK CONSTRAINT [FK_M02ArticlePersons_M06Persons]

মুছে ফেলার পরে সীমাবদ্ধতাটি আবার চালু করতে ভুলবেন না

ALTER TABLE [workdemo.no].[dbo].[M06Persons] WITH CHECK CHECK CONSTRAINT [FK_M02ArticlePersons_M06Persons]

দ্বিতীয় পছন্দটি হ'ল ডিলিট ক্যাসকেড বিকল্পটি ব্যবহার করে সীমাবদ্ধতাটি ড্রপ এবং পুনরায় যুক্ত করা হবে:

ALTER TABLE [workdemo.no].[dbo].[M06Persons] DROP CONSTRAINT [FK_M02ArticlePersons_M06Persons]

ALTER TABLE [workdemo.no].[dbo].[M06Persons] WITH NOCHECK ADD CONSTRAINT [FK_M02ArticlePersons_M06Persons] FOREIGN KEY(M06PersonId)
REFERENCES <parent table here> (<parent column here>)
ON DELETE CASCADE

আপনার এফকে নামের উপর ভিত্তি করে দেখে মনে হচ্ছে আপনার পিতামাতার টেবিলটি এম02আর্টিকাল পার্সন এবং প্যারেন্ট কলামটি এম06 পার্সন।

আপনি যদি এই স্কিমাটি লেখেন না তবে দয়া করে কেন বাধা উপস্থিত থাকতে পারে তা বিবেচনা করার চেষ্টা করুন এবং বুঝতে পারেন যে এই পদ্ধতিতে তাদের লঙ্ঘন করলে অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া হতে পারে।


2

dbo.M02ArticlePersons কলাম M06PersonId এর সারণি অন্য সারণীতে পুনরায় প্রকাশ করা হয়েছে। সুতরাং বিবৃতি মোছার আগে, এই সম্পর্কগুলি অক্ষম করুন এবং আবার চেষ্টা করুন

নীচে বিদেশী কী নিষ্ক্রিয় করার জন্য is

 ALTER TABLE dbo.M02ArticlePersons NOCHECK CONSTRAINT FK_M02ArticlePersons_M06Persons

DELETE FROM [workdemo.no].[dbo].[M06Persons] 
  WHERE ID > '13'
GO

এবং এটি এটি সক্ষম করার জন্য

ALTER TABLE dbo.M02ArticlePersons CHECK CONSTRAINT FK_M02ArticlePersons_M06Persons

আশা করি এটি কার্যকর হবে


2
ভয়াবহ পরামর্শ। আপনি সিনিয়র ডিবিএর মত এফকেসির প্রতিবন্ধকতা কখনই অক্ষম করা উচিত নয় (যারপরে আপনি উপরের প্রশ্নটি লেখেন না)। আপনাকে রেকর্ড মুছতে বাধা দেওয়ার জন্য এই প্রতিবন্ধকতা রয়েছে। উইলি নিলি অক্ষম করা আপনার ডেটাবেজে খারাপ ডেটা দেবে। আপনি একটি খারাপ অভ্যাস একটি ভাল না recommedning হয়।
এইচএলজিইএম

1

এছাড়াও অন্য একটি ম্যানুয়াল বিকল্প রয়েছে:

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


1

এই ছোট কোডটি যে কোনও টেবিল থেকে রেকর্ডস মুছতে চান তার জন্য সহায়তা করবে। এটি রেফারেন্সিয়াল অখণ্ডতারও যত্ন নেয় ...

কোডের নীচে DELETE বিবৃতি উত্পন্ন করবে .. কেবলমাত্র স্কিমা.ট্যাবল_নাম উল্লেখ করুন

Declare @sql1 varchar(max)
      , @ptn1 varchar(200)
      , @ctn1 varchar(200)
      , @ptn2 varchar(200)
      , @ctn2 varchar(200)
--
SET @ptn1 = ''
--
SET @ctn1 = ''
--
SET @ptn2 = ''
--
SET @ctn2 = ''
--
SELECT @sql1 = case when (@ptn1 <> OBJECT_NAME (f.referenced_object_id)) then
                         COALESCE( @sql1 + char(10), '') + 'DELETE' + char(10) + ' ' + OBJECT_NAME (f.referenced_object_id) + ' FROM ' + OBJECT_NAME(f.parent_object_id) + ', '+OBJECT_NAME (f.referenced_object_id) + char(10) +' WHERE ' + OBJECT_NAME(f.parent_object_id) + '.' + COL_NAME(fc.parent_object_id, fc.parent_column_id) +'='+OBJECT_NAME (f.referenced_object_id)+'.'+COL_NAME(fc.referenced_object_id, fc.referenced_column_id)
                    else
                         @sql1 + ' AND ' + OBJECT_NAME(f.parent_object_id) + '.' + COL_NAME(fc.parent_object_id, fc.parent_column_id) +'='+OBJECT_NAME (f.referenced_object_id)+'.'+COL_NAME(fc.referenced_object_id, fc.referenced_column_id)
                    end + char(10)
     , @ptn1 = OBJECT_NAME (f.referenced_object_id)
     , @ptn2  = object_name(f.parent_object_id)
FROM   sys.foreign_keys AS f
       INNER JOIN
       sys.foreign_key_columns AS fc ON f.object_id = fc.constraint_object_id
WHERE  f.parent_object_id = OBJECT_ID('dbo.M06Persons'); -- CHANGE here schema.table_name
--
print  '--Table Depended on ' + @ptn2 + char(10) + @sql1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.