TSQL: Create a view that accesses multiple databas

2019-01-08 22:53发布

I have a special case,

for example in table ta in database A, it stores all the products I buy

table ta(
id,
name,
price
)

in table tb in database B, it contain all the product that people can buy

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

Can I create a view in database A to list all the products that I haven`t bought?

3条回答
Evening l夕情丶
2楼-- · 2019-01-08 23:03

As the other answers indicate, you can use the {LINKED_SERVER.}DATABASE.SCHEMA.OBJECT notation.

You should also be aware that cross-database ownership chaining is disabled by default.

So within a database, granting SELECT on a view allows a user who may not have SELECT on the underlying tables to still SELECT from the view. This may not work across to another database where the user does not have permissions on the underlying table.

查看更多
放荡不羁爱自由
3楼-- · 2019-01-08 23:17

Yes you can - the t-sql syntax is the same as within any other cross database call (within a stored procedure for example).

To reference your tables in the second database you simply need:

[DatabaseName].[Schema].[TableName]

So you would end up with something like

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

Note that this will only work on the same server - if your databases are on different servers them you will need to create a linked server.

查看更多
你好瞎i
4楼-- · 2019-01-08 23:17

Yes, views can reference three part named objects:

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

There will be problems down the road with cross db queries because of backup/restore consistency, referential integrity problems and possibly mirorring failover, but those problems are inherent in having the data split across dbs.

查看更多
登录 后发表回答