Подтвердить что ты не робот

TSQL: создание представления, которое обращается к нескольким базам данных

У меня есть специальный случай,

например, в таблице ta в базе данных A, он хранит все продукты, которые я покупаю

table ta(
id,
name,
price
)

в таблице tb в базе данных B, он содержит весь продукт, который люди могут купить

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

Можно ли создать представление в базе данных A для отображения всех продуктов, которые я не купил?

4b9b3361

Ответ 1

Да, вы можете - синтаксис t-sql такой же, как и в любом другом вызове перекрестной базы данных (например, в хранимой процедуре).

Чтобы ссылаться на ваши таблицы во второй базе данных, вам просто нужно:

[имя_базы_данный]. [Схема]. [TableName]

Итак, у вас получится что-то вроде

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

Обратите внимание, что это будет работать только на одном сервере - если ваши базы данных находятся на разных серверах, вам необходимо создать связанный сервер.

Ответ 2

Да, представления могут ссылаться на три части именованных объектов:

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

Проблемы с перекрестными db-запросами будут возникать из-за согласованности резервного копирования и восстановления, проблем с референциальной целостностью и, возможно, зеркального переключения при сбое, но эти проблемы присущи тому, что данные разделены на dbs.

Ответ 3

Как показывают другие ответы, вы можете использовать запись {LINKED_SERVER.} DATABASE.SCHEMA.OBJECT.

Вам также следует помнить, что по умолчанию отключена перекрестная база данных цепочка прав собственности.

Таким образом, в базе данных предоставление SELECT в представлении позволяет пользователю, у которого не может быть SELECT на базовых таблицах, чтобы все еще выбрать SELECT из представления. Это может не работать в другой базе данных, где у пользователя нет прав на базовую таблицу.