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

joj*_*ojo 31 t-sql database sql-server view

我有一个特例,

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

table ta(
id,
name,
price
)
Run Code Online (Sandbox Code Playgroud)

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

table tb(
id,
name,
price
....
)
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*all 43

是的,你可以 - 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
Run Code Online (Sandbox Code Playgroud)

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

  • 我想补充一点,我做了这样的事情。但是,应该注意的是,如果要指定要在其中创建视图的数据库的名称,则不能使用“ CREATE VIEW abc.dbo.YourView”。您必须改为运行“ USE abc”,然后运行“ CREATE VIEW dbo.YourView”,否则,您将得到一个错误。 (2认同)

Cad*_*oux 6

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

您还应该知道默认情况下禁用跨数据库所有权链接.

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

  • 是的。访问视图的 SQL 用户需要对任何引用的数据库具有读取权限。 (2认同)

Rem*_*anu 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 ...
Run Code Online (Sandbox Code Playgroud)

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