2009-01-14 12 views
6

मेरे पास एक लिंक सर्वर से कहीं और SQL सर्वर है जो किसी अन्य डेटाबेस पर कहीं और है। मुझे लगता है कि जुड़ा हुआ सर्वर पर एक दृश्य पैदा की हैक्या आपके पास SQLServer 2k5 में किसी लिंक की गई सर्वर तालिका के दृश्य पर एक विदेशी कुंजी हो सकती है?

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]) 
फिर

मैं मिल निम्न त्रुटि:

The object name 'LINKEDSERVER.RemoteDatabase.dbo.tbl_bar' contains more than the maximum number of prefixes. The maximum is 2.

वहाँ किसी भी तरह से मैं एक ही प्रभाव को प्राप्त कर सकता है ?

+0

आप किसी भी हो रही है त्रुटि? –

+0

हां: विदेशी कुंजी 'fk1_baz_to_foo' संदर्भ ऑब्जेक्ट 'dbo.vw_foo' जो उपयोगकर्ता तालिका नहीं है। – d4nt

उत्तर

9

विदेशी कुंजी गैर-स्थानीय वस्तुओं से कनेक्ट नहीं की जा सकती - उन्हें स्थानीय टेबल का संदर्भ देना होगा। आपको "उपसर्गों की अधिकतम संख्या" त्रुटि मिलती है क्योंकि आप तालिका को 4-भाग वाले नाम (LinkedServer.Database.Schema.Object) के साथ संदर्भित कर रहे हैं, और स्थानीय ऑब्जेक्ट में केवल 3-भाग का नाम होगा।

अन्य समाधान:

  1. स्रोत (दृश्य का स्थान) तालिका आप पर कुंजी जोड़ने के लिए कोशिश कर रहे हैं के रूप में एक ही सर्वर से डेटा की प्रतिकृति। स्रोत डेटा में कितनी बार परिवर्तन होता है, इस पर निर्भर करते हुए आप यह प्रति घंटा, दैनिक, या जो कुछ भी कर सकते हैं।
  2. अपनी स्थानीय प्रति में किसी भी बदलाव को धक्का देने के लिए स्रोत तालिका पर एक ट्रिगर जोड़ें। यह अनिवार्य रूप से # 1 जैसा ही होगा, लेकिन परिवर्तन की तत्काल जनसंख्या
  3. "अपनी तालिका में ट्रिगर करें जो लिंक किए गए सर्वर से चयन करके और उस मूल्य की तुलना करके मैन्युअल रूप से विदेशी कुंजी बाधा को जांचता है सम्मिलित/अपडेट। यदि यह मेल नहीं खाता, तो आप परिवर्तन अस्वीकार कर सकते हैं।
0

नहीं, उपयोगकर्ता टेबल के विरुद्ध विदेशी कुंजी बनाना है। क्या आपने नीचे की कोशिश की है?

alter table [baz] with check 
add constraint [fk1_baz_to_foo] 
FOREIGN KEY([foo_id]) 
references 
    LINKEDSERVER.RemoteDatabase.dbo.tbl_bar([id]) 
go 
+1

हां, वह त्रुटियां: "ऑब्जेक्ट नाम 'LINKEDSERVER.RemoteDatabase.dbo.tbl_bar' में अधिकतम उपसर्गों की संख्या शामिल है। अधिकतम 2 है। " – d4nt

+1

क्रॉस-डेटाबेस विदेशी कुंजी संदर्भ समर्थित नहीं हैं! –

1

आप कर सकते हैं, लेकिन आप इसे ऐसा करने के लिए कुछ गतिशील एसक्यूएल प्रवंचना का उपयोग करना होगा।

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

exec YourServer.master.dbo.sp_executesql @SQL