我有一个特例,
例如在数据库ta
中的表A
中,它存储了我购买的所有产品
table ta(
id,
name,
price
)
在数据库tb
中的表B
中,它包含了人们可以购买的所有产品
table tb(
id,
name,
price
....
)
我可以在数据库A
中创建一个视图,列出我还没买过的所有产品吗?
答案 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所固有的。