2010-01-26 5 views
22

Ich habe einen Sonderfall greift,TSQL: Erstellen Sie eine Ansicht, die mehrere Datenbanken

zum Beispiel in Tabelle ta in Datenbank A, es speichert alle Produkte I

table ta(
id, 
name, 
price 
) 

in Tabelle tb in Datenbank kaufen B, enthalten sie alle Produkt, das Menschen

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

kann ich eine Ansicht in der Datenbank erstellen

kaufen A, um alle Produkte aufzulisten, die ich nicht gekauft habe?

Antwort

35

Ja, Sie können - die T-SQL-Syntax ist die gleiche wie in jedem anderen Cross-Datenbank-Aufruf (innerhalb einer gespeicherten Prozedur zum Beispiel).

Um Ihre Tabellen in der zweiten Datenbank verweisen müssen Sie einfach:..

[Database] [Schema] [Tablename]

Also würde man mit so etwas wie

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 
Ende

Beachten Sie, dass dies nur auf demselben Server funktioniert. Wenn sich Ihre Datenbanken auf verschiedenen Servern befinden, müssen Sie einen Verbindungsserver erstellen.

+0

lassen Sie mich versuchen .. ja..alle meine Datenbank sind auf dem gleichen Server. – jojo

+1

Ich möchte hinzufügen, dass ich so etwas getan habe. Beachten Sie jedoch, dass Sie den Namen der Datenbank, in der die Ansicht erstellt werden soll, nicht angeben können, indem Sie 'CREATE VIEW abc.dbo.YourView' verwenden. Sie müssen stattdessen 'USE abc' und dann' CREATE VIEW dbo.YourView' ausführen. Andernfalls erhalten Sie eine Fehlermeldung. –

5

Ja, Ansichten dreiteiliger benannte Objekte verweisen können:

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

Es wird der Weg sein, um Probleme nach unten mit Quer db Abfragen wegen Backup/Restore-Konsistenz, referentielle Integritätsprobleme und möglicherweise mirorring Failover, aber diese Probleme sind inhärent, wenn die Daten über dbs aufgeteilt werden.

3

Wie die anderen Antworten anzeigen, können Sie die Schreibweise {LINKED_SERVER.} DATABASE.SCHEMA.OBJECT verwenden.

Sie sollten auch beachten, dass die datenbankübergreifende ownership chaining standardmäßig deaktiviert ist.

In einer Datenbank ermöglicht das Gewähren von SELECT für eine Ansicht einem Benutzer, der SELECT für die zugrundeliegenden Tabellen möglicherweise nicht hat, SELECT aus der Ansicht. Dies funktioniert möglicherweise nicht in einer anderen Datenbank, in der der Benutzer keine Berechtigungen für die zugrunde liegende Tabelle hat.

+0

Ja. Der SQL-Benutzer, der auf die Ansicht zugreift, muss über Leseberechtigungen für jede referenzierte Datenbank verfügen. – Jecoms

Verwandte Themen