2010-01-26 10 views
22

que tengo un caso especial,TSQL: Crear una vista que tiene acceso a múltiples bases de datos

por ejemplo, en la tabla ta la base de datos A, almacena todos los productos que compro

table ta(
id, 
name, 
price 
) 

en la tabla tb la base de datos B, que contienen todos los productos que la gente puede comprar

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

¿Puedo crear una vista en la base de datos A para enumerar todos los productos que no he comprado?

Respuesta

35

Sí, puede: la sintaxis de t-sql es la misma que en cualquier otra llamada de base de datos cruzada (dentro de un procedimiento almacenado, por ejemplo).

Para hacer referencia a las tablas en la segunda base de datos que necesita simplemente:..

[NombreBaseDatos] [esquema] [NombreTabla]

Por lo que terminaría con algo como

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 

Tenga en cuenta que esto solo funcionará en el mismo servidor: si sus bases de datos están en servidores diferentes, deberá crear un servidor vinculado.

+0

déjame intentar ... sí ... todas mis bases de datos están en el mismo servidor. – jojo

+1

Me gustaría agregar que hice algo como esto. Sin embargo, debe tenerse en cuenta que si desea especificar el nombre de la base de datos en la que crear la vista, no puede usar 'CREATE VIEW abc.dbo.YourView'. En su lugar, debe ejecutar 'USE abc' y luego' CREATE VIEW dbo.YourView' De lo contrario, obtendrá un error. –

5

Sí, las vistas pueden hacer referencia a tres pieza denominada objetos:

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

Habrá problemas en el futuro con las consultas db cruz a causa de copia de seguridad de la consistencia, los problemas de integridad referencial y la conmutación por error posiblemente mirorring, pero esos problemas/restauración son inherentes a tener los datos divididos en dbs.

3

Como indican las otras respuestas, puede usar la notación {LINKED_SERVER.} DATABASE.SCHEMA.OBJECT.

También debe tener en cuenta que la base de datos cruzada ownership chaining está deshabilitada de manera predeterminada.

Por lo tanto, dentro de una base de datos, otorgar SELECT en una vista permite que un usuario que no tenga SELECT en las tablas subyacentes aún SELECCIONE de la vista. Es posible que esto no funcione en otra base de datos donde el usuario no tenga permisos en la tabla subyacente.

+0

Sí. El usuario de SQL que accede a la vista necesita tener permisos de lectura para cualquier base de datos referenciada. – Jecoms

Cuestiones relacionadas