দুটি ডাটাবেসের মধ্যে বৈদেশিক কী সম্পর্ক যুক্ত করুন


90

দুটি ভিন্ন ডাটাবেসে আমার দুটি টেবিল রয়েছে। টেবিল 1 এ (ডাটাবেস 1 এ) কলাম 1 নামক একটি কলাম রয়েছে এবং এটি একটি প্রাথমিক কী। এখন টেবিল 2 এ (ডাটাবেস 2 এ) কলাম 2 নামে একটি কলাম আছে এবং আমি এটি একটি বিদেশী কী হিসাবে যুক্ত করতে চাই।

আমি এটি যুক্ত করার চেষ্টা করেছি এবং এটি আমাকে নিম্নলিখিত ত্রুটি দিয়েছে:

এমএসজি 1763, স্তর 16, রাজ্য 0, লাইন 1
ক্রস-ডাটাবেস বিদেশী কী উল্লেখগুলি সমর্থিত নয়। বিদেশী কী ডাটাবেস 2.table2।

এমএসজি 1750, স্তর 16, রাজ্য 0, লাইন 1
সীমাবদ্ধতা তৈরি করতে পারেনি। পূর্ববর্তী ত্রুটিগুলি দেখুন।

আমি কীভাবে করব যেহেতু টেবিলগুলি বিভিন্ন ডাটাবেসে থাকে।

উত্তর:


84

একটি ট্রিগার ব্যবহার করে আপনার ডাটাবেসগুলিতে রেফারেন্সিয়াল সীমাবদ্ধতা পরিচালনা করতে হবে।


মূলত আপনি একটি সন্নিবেশ তৈরি করেন, প্রাথমিক কী সারণীতে কীটির অস্তিত্ব যাচাই করতে ট্রিগার আপডেট করুন। যদি কীটি বিদ্যমান না থাকে তবে সন্নিবেশ বা আপডেটটি পুনরায় করুন এবং তারপরে ব্যতিক্রমটি পরিচালনা করুন।

উদাহরণ:

Create Trigger dbo.MyTableTrigger ON dbo.MyTable, After Insert, Update
As
Begin

   If NOT Exists(select PK from OtherDB.dbo.TableName where PK in (Select FK from inserted) BEGIN
      -- Handle the Referential Error Here
   END

END

সম্পাদিত: কেবল স্পষ্ট করার জন্য। রেফারেন্সিয়াল অখণ্ডতা প্রয়োগের সাথে এটি সর্বোত্তম পন্থা নয়। আদর্শভাবে আপনি একই ডিবিতে উভয় টেবিল চাইবেন তবে যদি এটি সম্ভব না হয়। তারপরে উপরেরটি আপনার চারপাশের একটি সম্ভাব্য কাজ।


4
@ জন হার্টসক - উপরের উদাহরণটি যথাযথ লেনদেন পরিচালনা না করে সহজেই ব্যর্থ হতে পারে। সমস্যা হল সঙ্গে ঘটতে পারে ধরণ একটি শালীন আলোচনা পাওয়া যাবে এখানে "যদি না (বিদ্যমান) তাহলে সন্নিবেশ" - stackoverflow.com/questions/108403/...
EBarr

16
@ জন হার্টসক - আপনার সমাধানটির একটি ফাঁক রয়েছে: যদি দুটি ডাটাবেসের মধ্যে একটির ব্যাকআপ থেকে পুনরুদ্ধার করা হয় তবে ট্রিগাররা অবশ্যই তা চালিয়ে যায় না। এভাবেই আমরা অনাথ সারি দিয়ে শেষ করতে পারি।
একে

4
নিখুঁতভাবে আমি যেমন ব্যাখ্যা করেছি এটি সর্বোত্তম পদ্ধতির নয় তবে আশেপাশের একটি সম্ভাব্য কাজ।
জন হার্টসক

4
এটি ঠিক ততটা ভুল ... আমি আশা করি ওপি বুঝতে পেরেছিল যে ঠিক যে তিনি এই জাতীয় কিছু জিজ্ঞাসা করছেন, এটি একটি লক্ষণ যা তিনি সম্ভবত কিছু ভুল করছেন ...
ট্রিগারদের

4
@ মারকো যেমন আমি আমার জবাবটিতে পোস্ট করেছি "কেবল স্পষ্ট করে বলার জন্য। রেফারেনশিয়াল অখণ্ডতা প্রয়োগের সাথে এটি সর্বোত্তম পন্থা নয়। আদর্শভাবে আপনি একই ডিবিতে উভয় টেবিল চাইবেন তবে যদি তা সম্ভব না হয় তবে উপরেরটি সম্ভবত একটি সম্ভাব্য কাজ আপনি." আমি বুঝিয়েছি যে এটি সম্ভবত একটি ভাল ধারণা নয়।
জন হার্টসক

48

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

এই কারণেই ডাটাবেসের মধ্যে এফকে সমর্থনযোগ্য নয়।


27

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

তারপরে সারণীতে দ্বিতীয় অবস্থানে traditionalতিহ্যবাহী এফকে সম্পর্ক যুক্ত করুন যা কার্যকরভাবে কেবল পঠনযোগ্য অনুলিপি।

অনুলিপিটি আপডেট রাখতে আপনি প্রাথমিক স্থানে ট্রিগার বা নির্ধারিত কাজটি ব্যবহার করতে পারেন।


4
রে "অনুলিপিটি আপডেট রাখতে আপনি প্রাথমিক স্থানে ট্রিগার বা কাজের সময় নির্ধারণ করতে পারেন": এসকিউএল সার্ভারের প্রতিরূপ কেন ব্যবহার করবেন না (বিশেষত লেনদেন বনাম মার্জ টাইপের সাবস্ক্রাইবারের অনুলিপি (যে অনুলিপিটিতে টেবিলগুলিতে বিদেশী মূল সীমাবদ্ধতার প্রয়োজন রয়েছে) কেবলমাত্র তাই নয়) কেবল পঠনযোগ্য হওয়া দরকার)? দেখুন: লিঙ্ক
টম

@ টম হ্যাঁ, আপনি অবশ্যই টেক্সটের অনুলিপি একটি দূরবর্তী ডাটাবেসে আপডেট রাখতে প্রতিলিপি ব্যবহার করতে পারেন।
কেড রক্স

20

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

CREATE FUNCTION dbo.fn_db2_schema2_tb_A
(@column1 INT) 
RETURNS BIT
AS
BEGIN
    DECLARE @exists bit = 0
    IF EXISTS (
      SELECT TOP 1 1 FROM DB2.SCHEMA2.tb_A 
      WHERE COLUMN_KEY_1 =  @COLUMN1
    ) BEGIN 
         SET @exists = 1 
      END;
      RETURN @exists
END
GO

ALTER TABLE db1.schema1.tb_S
  ADD CONSTRAINT CHK_S_key_col1_in_db2_schema2_tb_A
    CHECK(dbo.fn_db2_schema2_tb_A(key_col1) = 1)

4
গৃহীত উত্তরের চেয়ে এটি একটি ভাল সমাধান এবং আপনি এটি একাধিক টেবিলগুলিতেও পুনরায় ব্যবহার করতে পারেন
মিলক্স

3

সংক্ষিপ্ত উত্তরটি হ'ল এসকিউএল সার্ভার (এসকিউএল ২০০৮ হিসাবে) ক্রস ডাটাবেস বিদেশী কীগুলি সমর্থন করে না - ত্রুটির বার্তাটি বলেছে।

আপনার কাছে ঘোষিত রেফারেনশিয়াল অখণ্ডতা (এফকে) থাকতে না পারলে আপনি ট্রিগারগুলি ব্যবহার করে একই লক্ষ্যে পৌঁছতে পারেন। এটি কিছুটা কম নির্ভরযোগ্য, কারণ আপনি যে যুক্তিটি লেখেন তাতে বাগ থাকতে পারে, তবে এটি আপনাকে সেখানে একইভাবে পেয়ে যাবে।

এসকিউএল ডক্স @ http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx দেখুন কোন রাজ্যে:

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

এসকিউএলটিয়ামেও ঠিক আছে আলোচনা - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135


0

ত্রুটির বার্তাটি যেমন বলেছে এটি স্কেল সার্ভারে সমর্থিত নয়। রিফ্রেনশিয়াল অখণ্ডতা নিশ্চিত করার একমাত্র উপায় হ'ল ট্রিগারগুলির সাথে কাজ করা।


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