TSQL:创建一个访问多个数据库的视图

时间:2010-01-26 22:34:31

标签: sql-server database tsql view

我有一个特例,

例如在数据库ta中的表A中,它存储了我购买的所有产品

table ta(
id,
name,
price
)

在数据库tb中的表B中,它包含了人们可以购买的所有产品

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

我可以在数据库A中创建一个视图,列出我还没买过的所有产品吗?

3 个答案:

答案 0 :(得分:41)

是的,你可以 - t-sql语法与任何其他跨数据库调用相同(例如在存储过程中)。

要在第二个数据库中引用您的表,您只需:

[数据库名]。[架构]。[表名]

所以你最终会得到像

这样的东西
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

请注意,这只能在同一台服务器上运行 - 如果您的数据库位于不同的服务器上,则需要创建链接服务器。

答案 1 :(得分:6)

正如其他答案所示,您可以使用{LINKED_SERVER。} DATABASE.SCHEMA.OBJECT表示法。

您还应该知道默认情况下禁用跨数据库ownership chaining

因此,在数据库中,在视图上授予SELECT允许可能没有基础表上的SELECT的用户仍然从视图中进行SELECT。这可能无法用于另一个用户对基础表没有权限的数据库。

答案 2 :(得分:5)

是的,视图可以引用三个命名对象:

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 ...

由于备份/恢复一致性,参照完整性问题以及可能的镜像故障转移,交叉数据库查询将会出现问题,但这些问题是将数据拆分为dbs所固有的。