TSQL: создание представления, которое обращается к нескольким базам данных
У меня есть специальный случай,
например, в таблице ta
в базе данных A
, он хранит все продукты, которые я покупаю
table ta(
id,
name,
price
)
в таблице tb
в базе данных B
, он содержит весь продукт, который люди могут купить
table tb(
id,
name,
price
....
)
Можно ли создать представление в базе данных A
для отображения всех продуктов, которые я не купил?
Ответы
Ответ 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 из представления. Это может не работать в другой базе данных, где у пользователя нет прав на базовую таблицу.