web-dev-qa-db-ja.com

TSQL:複数のデータベースにアクセスするビューを作成します

特別な場合がありますが、

たとえば、データベースtaのテーブルAには、購入したすべての製品が格納されます

table ta(
id,
name,
price
)

データベースtbのテーブルBには、人々が購入できるすべての製品が含まれています

table tb(
id,
name,
price
....
)

データベースAにビューを作成して、購入していないすべての製品を一覧表示できますか?

30
jojo

はい、できます-t-sql構文は、他のデータベース間呼び出しと同じです(たとえば、ストアドプロシージャ内)。

2番目のデータベースのテーブルを参照するには、次のものが必要です。

[データベース名]。[スキーマ]。[テーブル名]

だからあなたは次のようなものになるでしょう

CREATE VIEW [dbo].[YourView]
as
select 
a.ID, 
a.SomeInfo, 
b.SomeOtherInfo
from TableInA a
join DatabaseB.dbo.TableInB b
on -- your join logic goes here

これは同じサーバー上でのみ機能することに注意してください。データベースが異なるサーバー上にある場合は、リンクサーバーを作成する必要があります。

43
David Hall

他の回答が示すように、{LINKED_SERVER。} DATABASE.SCHEMA.OBJECT表記を使用できます。

また、クロスデータベース 所有権チェーン はデフォルトで無効になっていることにも注意してください。

そのため、データベース内でビューにSELECTを付与すると、基礎となるテーブルにSELECTを持たないユーザーでもビューからSELECTすることができます。これは、ユーザーが基になるテーブルに対するアクセス許可を持たない別のデータベースでは機能しない場合があります。

6
Cade Roux

はい、ビューはオブジェクトという名前の3つの部分を参照できます。

create view A.dbo.viewname as
select ... from A.dbo.ta as ta
join B.dbo.tb as tb on ta.id = tb.id
where ...

バックアップ/復元の一貫性、参照整合性の問題、および場合によってはフェールオーバーのミラーリングが原因で、クロスデータベースクエリで問題が発生しますが、これらの問題はデータが複数のデータベースに分割されることに固有のものです。

5
Remus Rusanu