2010-01-26 13 views
22

ho un caso speciale,TSQL: Creare una visualizzazione che accede più database

ad esempio nella tabella ta nel database A, memorizza tutti i prodotti compro

table ta(
id, 
name, 
price 
) 

nella tabella tb nel database B, che contengono tutto il prodotto che la gente può comprare

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

Posso creare una vista nel database A per elencare tutti i prodotti che non ho comprato?

risposta

35

Sì, è possibile - la sintassi t-sql è la stessa di qualsiasi altra chiamata di database incrociato (all'interno di una stored procedure, ad esempio).

Per riferimento le tabelle nel secondo database è sufficiente:..

[DatabaseName] [Schema] [TableName]

Così si finirebbe con qualcosa come

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 

Nota che questo funzionerà solo sullo stesso server - se i tuoi database si trovano su server diversi sarà necessario creare un server collegato.

+0

fammi provare .. si..tutti i miei database si trovano nello stesso server. – jojo

+1

Vorrei aggiungere che ho fatto qualcosa di simile. Tuttavia, si noti che se si desidera specificare il nome del database in cui creare la vista, non è possibile utilizzare 'CREATE VIEW abc.dbo.YourView'. Devi invece eseguire 'USE abc' e quindi' CREATE VIEW dbo.YourView' Altrimenti, riceverai un errore. –

5

Sì, viste possono fare riferimento a tre parti di nome oggetti:

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

ci saranno problemi lungo la strada con le query db croce a causa del backup/ripristino di coerenza, i problemi di integrità referenziale e failover possibilmente mirorring, ma questi problemi sono inerenti al fatto che i dati si dividono in dbs.

3

Come indicano le altre risposte, è possibile utilizzare la notazione {LINKED_SERVER.} DATABASE.SCHEMA.OBJECT.

Si noti inoltre che il cross-database ownership chaining è disabilitato per impostazione predefinita.

Quindi all'interno di un database, la concessione di SELEZIONA su una vista consente a un utente che non può avere SELEZIONA sulle tabelle sottostanti di SELEZIONARE ancora dalla vista. Questo potrebbe non funzionare in un altro database in cui l'utente non dispone delle autorizzazioni sulla tabella sottostante.

+0

Sì. L'utente SQL che accede alla vista deve disporre delle autorizzazioni di lettura per qualsiasi database di riferimento. – Jecoms

Problemi correlati