هل يمكن أن يكون لديك مفتاح خارجي في عرض جدول الخادم المرتبط في SQLServer 2k5؟

StackOverflow https://stackoverflow.com/questions/442587

سؤال

لدي SQLServer مع خادم مرتبط بقاعدة بيانات أخرى في مكان آخر.لقد قمت بإنشاء طريقة عرض على هذا الخادم المرتبط

create view vw_foo as
select
[id],
[name]
from LINKEDSERVER.RemoteDatabase.dbo.tbl_bar

أود أن ما يلي

alter table [baz] 
add foo_id int not null
go

alter table [baz] with check 
add constraint [fk1_baz_to_foo] 
  foreign key([foo_id]) 
  references [dbo].[vw_foo] ([id])
go

لكن هذا يولد الخطأ:"يشير المفتاح الخارجي 'fk1_baz_to_foo' إلى الكائن 'dbo.vw_foo' وهو ليس جدول مستخدم."

إذا حاولت وضع المفتاح الخارجي مباشرة على الطاولة باستخدام ما يلي

alter table [baz] with check 
add constraint [fk1_baz_to_bar] 
  foreign key([foo_id]) 
  references LINKEDSERVER.RemoteDatabase.dbo.tbl_bar ([id])

ثم أحصل على الخطأ التالي:

يحتوي اسم الكائن 'LINKEDSERVER.RemoteDatabase.dbo.tbl_bar' على أكثر من الحد الأقصى لعدد البادئات.الحد الأقصى هو 2.

هل هناك أي طريقة يمكنني من خلالها تحقيق نفس التأثير؟

هل كانت مفيدة؟

المحلول

لا يمكن توصيل المفاتيح الخارجية بكائنات غير محلية، بل يجب عليها الرجوع إلى الجداول المحلية.لقد حصلت على خطأ "الحد الأقصى لعدد البادئات" لأنك تشير إلى الجدول باسم مكون من 4 أجزاء (LinkedServer.Database.Schema.Object)، وسيكون للكائن المحلي اسم مكون من 3 أجزاء فقط.

حلول أخرى :

  1. قم بنسخ البيانات من المصدر (موقع العرض) إلى نفس الخادم مثل الجدول الذي تحاول إضافة المفتاح إليه.يمكنك القيام بذلك كل ساعة أو يوميًا أو أيًا كان، اعتمادًا على عدد مرات تغير البيانات المصدر.
  2. قم بإضافة مشغل على الجدول المصدر لدفع أي تغييرات إلى نسختك المحلية.سيكون هذا في الأساس هو نفس رقم 1، ولكن مع مجموعة من التغييرات الفورية
  3. أضف مشغل "بدلاً من" إلى جدولك الذي يتحقق يدويًا من قيد المفتاح الخارجي عن طريق الاختيار من الخادم المرتبط ومقارنة القيمة التي تحاول إدراجها/تحديثها.إذا لم يكن مطابقًا، يمكنك رفض التغيير.

نصائح أخرى

ويمكنك، ولكن لديك لاستخدام بعض الخداع SQL ديناميكية لتحقيق ذلك.

declare @cmd VARCHAR(4000)
SET @cmd = 'Use YourDatabase
ALTER TABLE YourTable
DROP CONSTRAINT YourConstraint'

exec YourServer.master.dbo.sp_executesql @SQL

لا، يجب أن تتم ضد الجداول المستخدم المفاتيح الخارجية. هل حاولت أدناه؟

alter table [baz] with check 
add constraint [fk1_baz_to_foo] 
FOREIGN KEY([foo_id]) 
references 
   LINKEDSERVER.RemoteDatabase.dbo.tbl_bar([id])
go
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top