web-dev-qa-db-fra.com

TSQL: créer une vue qui accède à plusieurs bases de données

J'ai un cas particulier,

par exemple dans la table ta dans la base de données A, il stocke tous les produits que j'achète

table ta(
id,
name,
price
)

dans la table tb dans la base de données B, elle contient tous les produits que les gens peuvent acheter

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

Puis-je créer une vue dans la base de données A pour lister tous les produits que je n'ai pas achetés?

30
jojo

Oui, vous pouvez - la syntaxe t-sql est la même que dans tout autre appel inter-base de données (dans une procédure stockée par exemple).

Pour référencer vos tables dans la deuxième base de données, il vous suffit de:

[DatabaseName]. [Schema]. [TableName]

Vous vous retrouveriez donc avec quelque chose comme

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

Notez que cela ne fonctionnera que sur le même serveur - si vos bases de données se trouvent sur des serveurs différents, vous devrez créer un serveur lié.

43
David Hall

Comme les autres réponses l'indiquent, vous pouvez utiliser la notation {LINKED_SERVER.} DATABASE.SCHEMA.OBJECT.

Vous devez également savoir que la base de données croisée chaînage de propriété est désactivée par défaut.

Ainsi, dans une base de données, l'octroi de SELECT sur une vue permet à un utilisateur qui n'a peut-être pas SELECT sur les tables sous-jacentes de toujours SELECT dans la vue. Cela peut ne pas fonctionner sur une autre base de données où l'utilisateur n'a pas d'autorisations sur la table sous-jacente.

6
Cade Roux

Oui, les vues peuvent référencer des objets nommés en trois parties:

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

Il y aura des problèmes sur la route avec les requêtes cross db en raison de la cohérence de la sauvegarde/restauration, des problèmes d'intégrité référentielle et éventuellement du basculement en miroir, mais ces problèmes sont inhérents au partage des données entre les dbs.

5
Remus Rusanu