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