Sie sind auf Seite 1von 8

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu...

Page 1 of 8

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vinculado? Cmo crear un Servidor Vinculado? Cmo configurar un Servidor Vinculado?
Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]
Cada da que pasa, se utilizan ms los Servidores Vinculados de SQL Server, para acceder a Orgenes de Datos OLEDB externos (consultar, importar datos, exportar datos, etc.). Este captulo pretende responder a las principales dudas y preguntas sobre Servidores Vinculados en SQL Server (es casi un pequeo manual sobre Servidores Vinculados ;-) Qu es un Servidor Vinculado? Para qu sirve un Servidor Vinculado? Cmo crear un Servidor Vinculado? Cmo configurar un Servidor Vinculado? Cmo y qu configurar de un Proveedor OLEDB para utilizar con un Servidor Vinculado? Cmo acceder y consultar tablas y vistas de un Servidor Vinculado? Cmo ejecutar un procedimiento almacenado remoto a travs de un Servidor Vinculado? OPENQUERY o Notacin de 4 Partes? Un Servidor Vinculado es una definicin de una Cadena de Conexin OLEDB y un Proveedor OLEDB que asociamos a un nombre lgico, es decir, nos permite definir un nombre para el servidor vinculado, y a dicho nombre especificarle qu Proveedor OLEDB y qu Cadena de Conexin se debe utilizar para acceder al correspondiente Origen de Datos OLEDB cuando se solicite acceso a dicho Servidor Vinculado. Como hablamos, un Servidor Vinculado sirve para acceder a Orgenes de Datos OLEDB desde SQL Server (es decir, para ejecutar Consultas Distribuidas, ejecutar Procedimientos Almacenados en servidores remotos, etc.). Como consecuencia de esto, se puede apreciar como ventaja de utilizar un Servidor Vinculado frente a especificar los datos de conexin al vuelo (ej: OPENROWSET u OPENDATASOURCE), el hecho de que el Servidor Vinculado acta como una capa de abstraccin de los datos de conexin y del Proveedor OLEDB utilizado. Es decir, una vez que hemos creado un Servidor Vinculado podemos acceder repetidas veces a dicho Origen de Datos sin tener que volver a especificar los datos de conexin (slo el nombre del Servidor Vinculado). Es ms, si accedemos a dicho Origen de Datos en mltiples consultas en mltiples sitios, si en un futuro deseamos que la conexin se realice a otro Origen de Datos (ej: por motivo de una migracin del mismo), es posible actualizar la definicin del Servidor Vinculado con nuevos datos de conexin sin necesidad de modificar cada consulta, y todo funcionar correctamente (elegante a la par que sencillo ;-). Sobre un Servidor Vinculado (Linked Server) es posible configurar con qu credenciales se conectarn los usuarios al Origen de Datos externo, lo cual, resulta de gran utilidad si el Origen de Datos externos lo permite (es decir, si es susceptible de que le indiquemos usuario y password). Para conseguirlo, podemos:
z

Miembros de

Menu de Usuario Iniciar Sesin Registrarse Restablecer Contrasea Ventajas de Registrarse Acerca de Contigo desde Oct 2007 771 usuarios registrados 86146 pageloads/mes Ranking Alexa 498160 Social Networks

Configurar un mapeo de Inicios de Sesin locales a usuarios remotos, de tal modo, que para cada Inicio de Sesin podemos configurar un Usuario y Contrasea especfico, o bien, podemos configurar Impersonate (Representar). La opcin de Impersonar (Impersonate o Representar), permite que se pasen las credenciales (nombre de usuario y contrasea) del Inicio de Sesin local al Servidor Vinculado. En caso de Inicios de Sesin de Windows, para el correspondiente usuario de Directorio Activo, debe estar desactivada la propiedad La cuenta es importante y no se puede delegar. Adems, los servidores local y remoto, deben tener un SPN (Service Principal Name) vlido registrado en Directorio Activo utilizando la utilidad setspn.exe (si utilizamos los nombres NetBIOS de los servidores, no debemos tener problemas, pero si accedemos a los servidores a travs de nombres DNS, si deberemos tener en cuenta el detalle del SPN y setspn.exe). Especificar la accin a realizar cuando un Inicio de Sesin que no est en el mapeo anterior, solicite acceso al Servidor Vinculado. Se puede configurar una de las siguientes opciones: { Not be made (No se establecern). Esto implica que los Inicios de Sesin que no estn mapeados, no podrn conectarse al Servidor Vinculado. { Be made without using a security context (Se establecern sin usar un contexto de seguridad). Esta opcin puede resultar de utilidad para acceder a Orgenes de Datos que no requieran Usuario y Password, por ejemplo, porque esta informacin est embebida dentro de la Cadena de Conexin (y por ello, no sea

Archivo
Abril de 2013 (3) Febrero de 2013 (5) Enero de 2013 (7) Diciembre de 2012 (12) Noviembre de 2012 (13) Octubre de 2012 (5) Septiembre de 2012 (3) Agosto de 2012 (6) Julio de 2012 (4)

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 2 of 8

necesario especificarla) o porque sencillamente no es necesario (ej: ficheros de texto). Be made using the logins current security context (Se establecern usando el contexto de seguridad actual del inicio de sesin). Utilizar las credenciales de actual Inicio de Sesin, para acceder al Servidor Vinculado. Be made using this security context (Se establecern usando el contexto de seguridad de un Usuario y Contrasea remota). Especificar un Usuario y Contrasea especfico para acceder al Servidor Vinculado.

Mi recomendacin (en la medida que se pueda, y en los casos que sea til) es utilizar siempre los mapeos de Inicios de Sesin, y para aquellos Inicios de Sesin que no estn mapeados, asignarles la accin de Not be made (No establecer la conexin), para as poder controlar quin puede acceder al Servidor Vinculado y quin no (por motivos evidentes de Seguridad).

Adems, sobre un Servidor Vinculado (Linked Server) es posible definir varias opciones, que pueden resultar de gran utilidad. En particular, las opciones de un Servidor Vinculado que ms se suelen utilizar (ojo, que no son las nicas) son:
z

Data Access (Acceso a datos). Por defecto es True. Esta opcin tiene que estar activada para poder acceder a los datos del Servidor Vinculado, como por ejemplo, para ejecutar una simple SELECT sobre el Servidor Vinculado. Puede resultar de utilidad, como medio para deshabilitar un Servidor Vinculado, ya que sin necesidad de eliminarlo, conseguimos que se deje de acceder a dicho Origen de Datos externo (es decir, al Servidor Vinculado). RPC Out (Salida RPC). Por defecto es False. Es necesario activar esta opcin (RPC Out True) para poder ejecutar Procedimientos Almacenados remotos (es decir, ejecutar Procedimientos Almacenados en el Servidor Vinculado). Si no activamos RPC Out e intentamos ejecutar un Procedimiento Almacenado remoto, obtendremos el siguiente error (lo pongo en espaol y en ingls): Mens. 7411, Nivel 16, Estado 1, Lnea 1 El servidor 'VSQL01' no est configurado para RPC. Msg 7411, Level 16, State 1, Line 1 Server 'VSQL01' is not configured for RPC. La opcin de RPC Out es bastante importante. Por ejemplo, para ejecutar SQL Dinmico en un Servidor Vinculado (es decir, ejecutar SQL Dinmico en un servidor remoto), es necesario activar RPC Out (Salida RPC) en las opciones del Servidor Vinculado, indiferentemente de que utilicemos sp_executesql NCodigo Dinmico o EXEC(Codigo Dinmico) AT. Quizs pueda parecer incorrecto que RPC Out est deshabilitado por defecto. Sin embargo, esta es una muy buena prctica desde el punto de vista de la seguridad, de tal modo, que si no es necesario ejecutar Procedimientos Almacenados remotos (sobre Servidores Vinculados), no activamos RPC Out y evitamos que algn usuario pueda ser tentado por la curiosidad ;-)

Junio de 2012 (1) Mayo de 2012 (2) Abril de 2012 (7) Marzo de 2012 (16) Febrero de 2012 (9) Enero de 2012 (5) Diciembre de 2011 (10) Noviembre de 2011 (10) Octubre de 2011 (4) Septiembre de 2011 (5) Agosto de 2011 (2) Julio de 2011 (2) Junio de 2011 (4) Mayo de 2011 (2) Abril de 2011 (6) Marzo de 2011 (4) Febrero de 2011 (10) Enero de 2011 (5) Diciembre de 2010 (6) Noviembre de 2010 (4) Octubre de 2010 (8) Septiembre de 2010 (4) Agosto de 2010 (1) Julio de 2010 (3) Mayo de 2010 (5) Abril de 2010 (6) Marzo de 2010 (8) Febrero de 2010 (3) Enero de 2010 (1) Diciembre de 2009 (9) Noviembre de 2009 (14) Octubre de 2009 (2) Septiembre de 2009 (8) Agosto de 2009 (2) Julio de 2009 (10) Junio de 2009 (9) Mayo de 2009 (10) Abril de 2009 (9) Marzo de 2009 (3) Febrero de 2009 (2) Enero de 2009 (3) Noviembre de 2008 (2) Octubre de 2008 (2) Septiembre de 2008 (2) Agosto de 2008 (5) Julio de 2008 (5) Junio de 2008 (1) Mayo de 2008 (3) Abril de 2008 (2) Marzo de 2008 (2) Febrero de 2008 (2) Enero de 2008 (5) Noviembre de 2007 (2) Octubre de 2007 (2)

En la ayuda de SQL Server (los Libros en Pantalla Book On Line), puede encontrarse un mayor detalle de todas las opciones de configuracin de los Servidores Vinculados.

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 3 of 8

Las principales diferencias entre diferencia entre utilizar Servidores Vinculados (con OPENQUERY o con Notacin de 4 partes) o especificar los datos de conexin al vuelo (con OPENROWSET o con OPENDATASOURCE y Notacin de 4 partes), son precisamente que con los Servidores Vinculados podemos realizar los Mapeos de Inicios de Sesin y personalizar las opciones del Servidor Vinculado (como Data Access y RPC Out). Si especificamos los datos de conexin al vuelo, ser necesario hard-codear (es decir, escribir en el cdigo de forma fija) los datos de conexin (por lo tanto, sern los mismos para todos los usuarios excepto que nos montemos algn invento) y no podemos personalizar opciones como Data Access o RPC Out, es decir, no podramos limitar que los usuario ejecuten un Procedimiento Almacenado remoto o deshabilitar el acceso a datos para realizar una operacin de mantenimiento. Adems, el hecho de hard-codear implica que en el caso de que cambien los datos de conexin ser necesario alterar el cdigo fuente que utilice datos de conexin al vuelo (OPENROWSET u OPENDATASOURCE) en Procedimientos Almacenados, ficheros SQL que puedan tener los usuarios, cdigo T-SQL que pueda estar embebido en aplicaciones, etc., lo cual complica el mantenimiento frente a la utilizacin de Servidores Vinculados. Tambin es importante tener en cuenta, que en el caso de SQL Server 2005 es necesario activar la opcin de configuracin Ad Hoc Distributed Queries a travs del procedimiento almacenado sp_configure para poder utilizar OPENROWSET u OPENDATASOURCE, ya que en caso contrario, ni los administradores (es decir, ni los miembros de sysadmin) podrn acceder al Origen de Datos externo a travs consultas o Procedimientos Almacenados Transact-SQL con OPENROWSET u OPENDATASOURCE. Si no est activo Ad Hoc Distributed Queries e intentamos utilizar OPENROWSET u OPENDATASOURCE, obtendremos el siguiente error (lo muestro en espaol y en ingls): Mens. 15281, Nivel 16, Estado 1, Lnea 1 SQL Server bloque el acceso a STATEMENT 'OpenRowset/OpenDatasource' del componente 'Ad Hoc Distributed Queries' porque este componente est desactivado como parte de la configuracin de seguridad de este servidor. Un administrador del sistema puede habilitar el uso de 'Ad Hoc Distributed Queries' mediante sp_configure. Para obtener ms informacin sobre cmo habilitar 'Ad Hoc Distributed Queries', vea el tema sobre la configuracin de superficie en los Libros en pantalla de SQL Server. Msg 15281, Level 16, State 1, Line 1 SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online. Para configurar o activar la opcin Ad Hoc Distributed Queries con sp_configure, se debe ejecutar algo similar a:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'Ad Hoc Distributed Queries', 1 GO RECONFIGURE GO

Sin embargo, esta no es la nica barrera para poder utilizar OPENROWSET u OPENDATASOURCE. Para que un usuario no miembro de sysadmin (es decir, un usuario que no es administrador) pueda ejecutar consultas AdHoc o cdigo Transact-SQL con OPENROWSET u OPENDATASOURCE, debe estar deshabilitada la opcin DisallowAdhocAccess del Proveedor OLEDB utilizado (ej: para acceder a SQL Server es el Proveedor OLEDB SQLNCLI, para acceder a Analysis Services es el Proveedor OLEDB MSOLAP, para acceder a ODBC es el Proveedor OLEDB MSDASQL, etc.). De no ser as, slo podremos utilizar OPENROWSET u OPENDATASOURCE con Inicios de Sesin miembros de sysadmin (como es el caso del inicio de sesin sa), sin embargo, para los Inicios de Sesin no miembros de sysadmin se mostrar el siguiente error (lo muestro en espaol y en ingls): Mens. 7415, Nivel 16, Estado 1, Lnea 1 Denegado el acceso ad hoc al proveedor OLE DB 'SQLNCLI'. El acceso debe realizarse mediante

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 4 of 8

un servidor vinculado. Msg 7415, Level 16, State 1, Line 1 Ad hoc access to OLE DB provider 'SQLNCLI' has been denied. You must access this provider through a linked server. Las opciones de los Proveedores OLEDB, se puede ver y modificar accediendo a sus propiedades desde la carpeta Proveedor de SQL Server Management Studio (SSMS).

Existen mltiples propiedades, pero la propiedad que nos interesa es No permitir accessos ad hoc. Sin embargo, existe un problema con el dilogo de Propiedades del Proveedor OLEDB para el establecimiento de sta propiedad, debido a que al activar la opcin desde SSMS se crea correctamente la clave de registro DisallowAdhocAccess a 1, y en consecuencia el cambio tiene xito. Sin embargo, al desactivar la opcin, en vez de poner DisallowAdhocAccess a 0, elimina la clave de registro, y en consecuencia el cambio no tiene efecto, por lo cual seguir producindose el mensaje de error 7415. Mens. 7415, Nivel 16, Estado 1, Lnea 1 Denegado el acceso ad hoc al proveedor OLE DB 'SQLNCLI'. El acceso debe realizarse mediante un servidor vinculado. Msg 7415, Level 16, State 1, Line 1 Ad hoc access to OLE DB provider 'SQLNCLI' has been denied. You must access this provider through a linked server.

En consecuencia, es necesario modificar la opcin DisallowAdhocAccess del Proveedor OLEDB directamente modificando la correspondiente clave a travs del editor de registro de Windows (regedit.exe), y teniendo en cuenta no confundirnos de Proveedor OLEDB ni de Instancia de SQL Server al modificar el registro de Windows.

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 5 of 8

Debe tenerse en cuenta, que en ocasiones, es necesario crear la rama en el registro para el Proveedor OLEDB que deseeamos configurar. Por ejemplo, en la anterior pantalla capturada, no existe la rama del Proveedor OLEDB MSOLAP, por lo tanto, si lo deseamos configurar utilizando el Editor de Registro de Windows, primero ser necesario crear la rama del registro, y luego crear la clave del registro. Para configurar la opcin DisallowAdhocAccess en SQL Server 2005, deberemos identificar cul es nuestra instancia, y en qu directorio est instalada (ej: MSSQL.1, MSSQL.2, etc.), de tal modo, que los Proveedores OLEDB de dicha Instancia de SQL Server estarn definidos bajo la siguiente rama del Registro de Windows (tomando como ejemplo la Instancia MSSQL.1): HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers De este modo, si deseamos modificar el Proveedor OLEDB de SQL Server 2005 (que es SQLNCLI SQL Server Native Client), nos interesar en particular la siguiente rama del Registro de Windows: HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers\SQLNCLI En esta rama del Registro de Windows, ser necesario crear (o modificar, si existe) una clave con nombre DisallowAdhocAccess de tipo REG_DWORD y con valor 0. Para configurar la opcin DisallowAdhocAccess en SQL Server 7 y en SQL Server 2000, puede consultarse el siguiente Artculo de Soporte de Microsoft: HOW TO: Use the DisallowAdHocAccess Setting to Control Access to Linked Servers (SQL Server 7 y SQL Server 2000) Ahora que hemos comentado la importancia de las propiedades de los Proveedores OLEDB para acceder a Orgenes de Datos externos desde SQL Server, y que sabemos que dichas propiedades son por cada Proveedor OLEDB e Instancia de SQL Server, resulta apropiado comentar otra Propiedad de los Proveedores OLEDB que nos puede resultar de ayuda, la propiedad Allow InProcess (Permitir InProcess), que podremos encontrar en el Registro de Windows como AllowInProcess. La propiedad Allow InProcess de un Proveedor OLEDB le especifica a SQL Server si cuando tiene que utilizar dicho Proveedor OLEDB, debe instanciarlo dentro del propio proceso de la Instancia de SQL Server, o en un proceso separado (es decir, fuera de proceso). El mtodo ms seguro es fuera de proceso (Out of Process, es decir, deshabilitar Allow InProcess), de tal modo que en caso de que se produjesen errores en el Proveedor OLEDB, dichos errores no afecten a la estabilidad del proceso de SQL Server. Otro aspecto prctico de la propiedad Allow InProcess (Permitir InProcess) de un Proveedor OLEDB en SQL Server, es debido a los errores 7399 y 7303 que en alguna ocasin nos podramos encontrar. Por ejemplo, me he encontrado los errores 7399 y 7303 al utilizar el Proveedor MSOLAP (Analysis Server 2005) desde un Servidor Vinculado de SQL Server 2005. Adjunto el error (lo muestro en espaol y en ingls): Mens. 7399, Nivel 16, Estado 1, Lnea 1 El proveedor OLE DB "MSOLAP" para el servidor vinculado "AnalysisServices2005" inform de un error. El proveedor no proporcion informacin acerca del error. Mens. 7303, Nivel 16, Estado 1, Lnea 1 No se puede inicializar el objeto de origen de datos del proveedor OLE DB "MSOLAP" para el servidor vinculado "AnalysisServices2005". Msg 7399, Level 16, State 1, Line 1 The OLE DB provider "MSOLAP" for linked server "AnalysisServices2005" reported an error. The provider did not give any information about the error. Msg 7303, Level 16, State 1, Line 1 Cannot initialize the data source object of OLE DB provider "MSOLAP" for linked server "AnalysisServices2005". La solucin que encontr fu activar la propiedad Allow InProcess (Permitir InProcess) para el Proveedor OLEDB MSOLAP (el de Analysis Services 2005, que es el que estaba utilizando en el Servidor Vinculado). Una vez activada la propiedad Allow InProcess del Proveedor OLEDB MSOLAP, el acceso a Analysis Services 2005 desde el Servidor Vinculado de SQL Server 2005 funcion correctamente.

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 6 of 8

Por todo esto, la recomendacin general que se debe seguir es utilizar SIEMPRE Servidores Vinculados (con OPENQUERY o con Notacin de 4 partes) para el acceso a Orgenes de Datos externos, y slo especificar los datos de conexin al vuelo (OPENROWSET u OPENDATASOURCE) de forma excepcional para usos espordicos o pruebas aisladas. Para crear o eliminar un Servidor Vinculado (Linked Server) se debe utilizar los Procedimientos Almacenados de Sistema sp_addlinkedserver y sp_dropserver, para configurar las opciones de los Servidores Vinculados se puede utilizar el Procedimiento Almacenado de Sistema sp_serveroption, y para consultar los Servidores Vinculados existentes, puede consultarse la vista del catlogo sys.servers. Para configurar con qu usuarios conectarse al Origen de Datos externo (los Mapeos de Inicios de Sesin comentados anteriormente en este mismo Artculo) se puede utilizar el Procedimiento Almacenado del Sistema sp_addlinkedsrvlogin. No es posible modificar un Servidor Vinculado, por lo tanto, ser necesario eliminarlo y volverlo a crear, aunque si es posible cambiar sus opciones. Tambin es posible crear, eliminar y consultar los Servidores Vinculados existentes a travs de SQL Server Management Studio (SSMS), desde el Object Explorer, en Objetos del Servidor -> Servidores Vinculados (Server Objects -> Linked Servers). A continuacin se muestra un ejemplo de creacin de un Servidor Vinculado a una Instancia remota de SQL Server, desde Transact-SQL, utilizando los Procedimientos Almacenados del Sistema comentados:
EXEC master.dbo.sp_addlinkedserver @server = N'VSQL01', @srvproduct=N'SQL Server' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'VSQL01', @useself=N'False', @locallogin=N'matias', @rmtuser=N'matias', @rmtpassword='P@ssw0rd' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'collation name', @optvalue=null GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'VSQL01', @optname=N'use remote collation', @optvalue=N'true' GO

Ahora que ya sabemos qu son los Servidores Vinculados, conocemos algunos de los errores tpicos que podemos tener al trabajar con ellos, sabemos crear Servidores Vinculados y configurarlos, ha llegado el momento de saber cmo podemos utilizarlos. Principalmente disponemos de dos mtodos para especificar la consulta (o Procedimiento Almacenado, etc.) que deseamos ejecutar a travs de un Servidor Vinculado:
z

Consultas Passthrough: Especificar la consulta en una cadena, la cual, ser ejecutada tal cual por el Origen de Datos externo (OPENQUERY). Esta es quizs la opcin ms verstil y ptima, ya que permite utilizar la sintaxis del Origen de Datos externo, podemos especificar una clusula WHERE para que viajen por la red el menor nmero de datos posible, y adems, el procesamiento de la consulta sea realizado por el Origen de Datos externo (liberando de dicha carga a SQL Server). Por ejemplo, si deseamos consultar Analysis Services de SQL Server, podremos especificar la consulta MDX a travs de OPENQUERY. En el caso de otros motores de base de datos relacionales, podemos utilizar la sintaxis y funciones especficas del Origen de Datos (ej: funciones de texto, de fechas, etc. propias del Origen de Datos). As, para obtener las primeras 10 filas de una tabla, en SQL Server ejecutaramos una consulta tipo SELECT TOP 10, mientras que en Informix ejecutaramos una consulta tipo SELECT FIRST 10. En el caso de utilizar OPENQUERY para consultar Informix, podramos especificar la sintaxis SELEC FIRST as como cualquiera de las funciones propias de Informix. Otra ventaja de utilizar OPENQUERY es que funciona con todos los Orgenes de Datos OLEDB, al margen de que puedan producirse problemas particulares por la naturaleza de los distintos tipos de datos de SQL Server y el Origen de Datos OLEDB externo (es decir, por la diferencia de precisin entre los tipos de datos), o alguna otra peculiaridad. Tambin, en el caso de tener problemas con los tipos de datos, podemos realizar un Casting en la consulta remota, para que nos lleguen los datos a SQL Server de una forma correcta para su procesamiento (en el peor de los casos, siempre casting a texto, y en SQL Server otro casting al tipo deseado ;-). Utilizar la Notacin de 4 partes. Permite acceder a un Origen de Datos externo como si fuese parte de nuestra instancia de SQL Server. Este comportamiento se basa en la sintaxis utilizada por SQL Server para identificar un objeto cualquier: Nombre_Servidor.Nombre_BaseDatos.Nombre_Esquema.Nombre_Objeto Aunque habitualmente cuando ejecutamos una consulta, slo indicamos el nombre de los objetos implicados, como mucho prefijados por el Esquema (Nombre_Esquema.Nombre_Objeto), realmente el nombre completo de un objeto est formado por 4 parte: Nombre del Servidor, Nombre de la Base de Datos, Nombre del Esquema, y Nombre del Objeto. De hecho, el Nombre del Servidor, puede tratarse del servidor local (en el que se ejecuta la consulta) o de un Servidor Vinculado. Tiene la ventaja, de ser una sintaxis muy cmoda y fcil de interpretar (desde el punto de vista del mantenimiento de software), tanto para acceder a tablas en SELECT, INSERT, UPDATE, etc. como para ejecutar Procedimientos Almacenados remotos. Tiene como inconveniente, que SQL Server se traer la tabla completa, es decir, viajarn

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 7 of 8

todos los datos de la tabla remota por la red, y en caso de existir una clusula WHERE, la misma ser procesada por SQL Server, por lo tanto el procesamiento de la consulta ser realizada por SQL Server. Adems, no todos los Orgenes de Datos soportan la Notacin de 4 partes, por lo que habitualmente suele utilizarse slo con SQL Server (ojo, que tambin se puede utilizar con otros Orgenes de Datos, pero claro, con SQL Server se lleva especialmente bien ;-) Con esto, hemos aprendido algo ms: La recomendacin general (al margen de casos particulares) es utilizar Servidores Vinculados y OPENQUERY, aunque existen excepciones, ya que por ejemplo, al trabajar con servidores remotos de tipo SQL Server, es muy cmodo utilizar la Notacin de 4 partes, tanto para ejecutar Procedimientos Almacenados remotos, como para acceder a tablas que necesitemos leer de forma completa (si slo necesitamos unas filas, mejor OPENQUERY). Supongamos que tenemos un Servidor Vinculado denominado SQLProduccion. Podramos acceder al mismo ejecutando consultas como las siguientes:
-- Ejemplo de SELECT con Notacin de 4 partes SELECT * FROM SQLProduccion.BBDD.dbo.Provincias GO -- Ejemplo de INSERT con Notacin de 4 partes, desde una SELECT INSERT INTO SQLProduccion.BBDD.dbo.Provincias SELECT * FROM BBDDOrigen.dbo.Provincias GO -- Ejemplo de SELECT con OPENQUERY SELECT * FROM OPENQUERY(SQLProduccion, SELECT * FROM CRM.dbo.Facturas WHERE ClienteId=A3723589) GO -- Ejecutar un Procedimiento Almacenado Remoto EXEC SQLProduccion.BBDD.dbo.miProceso @Parametro GO

Un detalle muy importante al trabajar con OPENQUERY: no es posible especificar una variable ni concatenar al especificar la consulta SQL a ejecutar con OPENQUERY. Si deseamos ejecutar una consulta SQL dinmica (es decir, que pueda variar sus parmetros, etc.) a travs de un Servidor Vinculado con OPENQUERY, o bien, especificar de forma selectiva el Servidor Vinculado sobre el cual ejecutar la consulta, tendremos que utilizar SQL Dinmico, como se muestra en el siguiente ejemplo:
SET @sqlquery = 'SELECT * FROM OPENQUERY(VSQL01, ''SELECT * FROM facturas WHERE mes=''' + @Mes + ''')' EXEC(@sqlquery) GO

Puede encontrarse un ejemplo ms detallado en el artculo Cmo ejecutar consultas dinmicas sobre OPENROWSET o sobre Servidores Vinculados (OPENQUERY)? Y de momento poco ms... se podran contar muchas ms cosas sobre los Servidores Vinculados, pero para empezar, esta sesin introductoria no est mal ;-)

Volver a: [SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server]
[Fecha del Artculo (UTC): 16/09/2008] [Autor: GuilleSQL]

Comentarios
sistemas0711 - 22/03/2012 (UTC) Hola que tal , esta interesante tu articulo . Tengo un problema , tengo una base de datos SQL Server en un servidor A y una base de datos en Fox Pro en un servidor B ; cuando intento acceder desde el servidor A a la base de datos dbc del servidor B me sale un error en el path. Por lo que le sql solo permite. puedes ayudarme con esto ??

yorch - 25/04/2012 (UTC) Hola sistemas0711, fijate que yo he usado bases de datos de Fox como servidores vinculados, y la unica limitante con que me top es que los drivers solo funcionan a 32 bits, por eso debes de instalar el SQL Server para la plataforma x86; no s si ese sea tu error. Salu2 a to2

d4nny - 23/04/2013 (UTC) Tengo un problema al llamar un procedimiento almacenado que utiliza un servidor vinculado desde un visual.NET. Si ejecuto la procedure desde el SQL Server 2005, no tengo ningn problema. Pero si lo ejecuto desde un VB.NET me sale el siguiente mensaje: "No se puede crear una instancia del proveedor OLE DB "VFPOLEDB" para el servidor vinculado". A que se debe el problema

Juancho9858 - 23/04/2013 (UTC) hola Guille... me podrias avisar si los linked server afectan el rendimiento de la base de datos "original"???

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

SQL Server FAQ: Qu es un Servidor Vinculado? Para qu sirve un Servidor Vincu... Page 8 of 8

GuilleSQL - 23/04/2013 (UTC) Hola Juancho, La forma en que se utilicen los Linked Servers puede afectar grvemente al rendimiento, especialmente con grandes volmenes de datos y/o lineas de comunicacin lentas. Gracias ! Guille

Escribir un Comentario
Para poder escribir un comentario, debe Iniciar Sesin con un usuario. Si no dispone de un usuario, puede Registrarse y hacerse miembro. Si dispone de un usuario, pero no recuerda sus credenciales de acceso, puede Restablecer su Contrasea.

Esta informacin se proporciona "como est" sin garantas de ninguna clase, y no otorga ningn derecho. This information is provided "AS IS" with no warranties, and confers no rights. Copyright 2007 GuilleSQL, todos los derechos reservados.
GuilleSQL.com y GuilleSQL.net son tambin parte de Portal GuilleSQL. Visitas recibidas (Page Loads) en GuilleSQL (fuente: StatCounter): 2.810.904 Visitas

http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUER... 26/04/2013

Das könnte Ihnen auch gefallen