5

別のデータベースにリンクされたサーバーを備えた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

3 に答える 3

10

外部キーは非ローカルオブジェクトに接続できません。ローカルテーブルを参照する必要があります。テーブルを4つの部分からなる名前(LinkedServer.Database.Schema.Object)で参照しているため、「プレフィックスの最大数」エラーが発生し、ローカルオブジェクトには3つの部分からなる名前しかありません。

その他の解決策:

  1. ソース(ビューの場所)から、キーを追加しようとしているテーブルと同じサーバーにデータを複製します。これは、ソースデータが変更される頻度に応じて、1時間ごと、1日ごと、または何でも実行できます。
  2. ソーステーブルにトリガーを追加して、ローカルコピーに変更をプッシュします。これは基本的に#1と同じですが、変更がすぐに発生します
  3. リンクサーバーから選択し、INSERT / UPDATEしようとしている値を比較することにより、外部キー制約を手動でチェックするINSTEAD OF "トリガーをテーブルに追加します。一致しない場合は、変更を拒否できます。
于 2009-01-14T14:47:16.813 に答える
1

可能ですが、それを実現するには、動的SQLのトリックを使用する必要があります。

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

exec YourServer.master.dbo.sp_executesql @SQL
于 2009-02-04T02:28:11.090 に答える
0

いいえ、ユーザー テーブルに対して外部キーを作成する必要があります。以下を試しましたか?

alter table [baz] with check 
add constraint [fk1_baz_to_foo] 
FOREIGN KEY([foo_id]) 
references 
   LINKEDSERVER.RemoteDatabase.dbo.tbl_bar([id])
go
于 2009-01-14T11:10:11.247 に答える