Un Servidor Vinculado sirve para que el motor de base de datos (en este caso SQL Server) pueda tener acceso a otra BD para hacer consultas distribuidas, ejecutar Stored Prochttp://www.devtroce.com/wp-admin/edit.phpedures, entre otros, digamos de un modo “transaparente” ya sea del mismo proveedor o no.
Para lograr esto necesitamos un proveedor de datos OLEDB y definir su cadena de conexión, a la par de asignarle un nombre lógico, el cual será usado para su invocación directa. Una vez definido esto podemos utilizarlo de manera abstracta para conectarnos a otras fuentes sin necesidad de volver a escribir toda la cadena de conexión. Crear esto con otro motor o instancia de SQL Server es relativamente sencillo, por lo tanto me centraré más bien en hacerlo con el motor de otro fabricante, en este caso Firebird, el cual fue el que más problemas me dió, con MySQL y PostgreSQL incluso fue más sencillo.
Oficialmente Microsoft da soporte para crear Linked Servers contra SQL Server y Oracle, mientras que al resto deja de lado, aunque eso no quiere decir que no sean funcionales. En mis pruebas utilice varios proveedores OLEDB para Firebird de distintos fabricantes, entre libres y de paga, pero tan sólo una funcionó correctamente, cumpliendo completamente con los requisitos OLEDB, es una lástima realmente tener que presentarlo con una versión de paga, aunque si queremos probarlo podemos hacerlo por 30 días con IBProvider.
Una vez instalado el driver necesario, abrimos el Microsoft SQL Server Management Studio, nos logueamos, y en el explorador de objetos del IDE expandimos Objetos del Servidor, aqui veremos todos los Servidores Vinculados que creemos, para ver la lista de Proveedores podemos expandir la correspondiente Lista.

Ahora hacemos click secundario sobre la opcion Servidores Vinculados, elegimos Nuevo Servidor Vinculado, nos aparecera la siguiente ventana, en donde configuramos de la siguiente manera:
1 2 3 4 5 6 7 8 9 | Servidor Vinculado: FIREBIRD Tipo de Servidor: Otro Origen de Datos Proveedor: LCPI OLE DB Provider for InterBase [v3] [RC4] Nombre del Producto: LCPI OLE DB Provider for InterBase [v3] [RC4] Cadena de Proveedor: ado_exec_sp=True; auto_commit=True; auto_commit_dll=1; bicursor=True; ctype=none; data source=DB; dbclient_library=fbclient.dll; dbclient_type=fb2.0; dialec=3; enable_db_triggers=True; garbage_collect=True; Location=127.0.0.1:DB; odbc_call_sp=2; password=masterkey; schema_cache=1; support_odbc_query=True; ctype_user=none; unicode_mode=False; unicode_stmt=False; User ID=SYSDBA; rowset_vm_using=-1; inner_trans=False; std_exec_sp=True; exec_sp_named_param=True; |

Antes de Confirmar, debemos modificar algunas opciones, RPC (Remote Procedure Call) para poder ejecutar Stored Procedures en los Servidores Vinculados, y Salida RPC para que estos en casos de devolver valores los podamos capturar. Punto a considera, si no vamos a ejecutar SP ni SQL dinámico, deberíamos dejar deshabilitada esta opción, ya que deja abierta una punto de seguridad.
En la ayuda de SQL Server (los Libros en Pantalla – Book On Line), puede encontrarse un mayor detalle de todas las opciones de configuración de los Servidores Vinculados.

Necesariamente debemos configurar Ad Hoc Distributed Querys, si no lo hacemos, ni siquiera los usuarios administradores o pertenecientes al grupo SYSADMIN no podrán acceder al origen de datos. El error que devolvería sería el siguiente:
1 2 3 | Mens. 15281, Nivel 16, Estado 1, Línea 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 configuración de seguridad de este servidor. Un administrador del sistema puede habilitar el uso de 'Ad Hoc Distributed Queries' mediante sp_configure. Para obtener más información sobre cómo habilitar 'Ad Hoc Distributed Queries', vea el tema sobre la configuración 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. |
Esto lo habilitamos así:
1 2 3 4 5 6 7 8 | EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'Ad Hoc Distributed Queries', 1 GO RECONFIGURE GO |
De este modo ya tenemos configurado nuestro servidor vinculado y podemos utilizarlo como los siguientes ejemplos:
1 2 3 4 5 6 7 8 | -- query directo SELECT * FROM FIREBIRD...PERSONAL -- seleccionar a partir del Result Set de un Stored Procedure EXEC FIREBIRD...NOM_SLC_CONTENIDO_EMAIL -- Ejecutar Un SP sin devolucion de datos EXECUTE FIREBIRD...NOM_INS_REPOSITORIO_H 5,'2009-12-04 12:32:33','B','VINCULADO' |
Ahora bien, si no deseamos hacer esto de modo gráfico, podemos utilizar este script que hace lo mismo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /****** Objeto: LinkedServer [FIREBIRD] Fecha de la secuencia de comandos: 04/24/2009 17:23:54 ******/ EXEC master.dbo.sp_addlinkedserver @server = N'FIREBIRD', @srvproduct=N'LCPI OLE DB Provider for InterBase', @provider=N'LCPI.IBProvider.3', @provstr=N'ado_exec_sp=True;auto_commit=True;auto_commit_dll=1;bicursor=True;ctype=none;data source=DB;dbclient_library=fbclient.dll;dbclient_type=fb2.0;dialec=3;enable_db_triggers=True;garbage_collect=True;Location=127.0.0.1:DB;odbc_call_sp=2;password=masterkey;schema_cache=1;support_odbc_query=True;ctype_user=none;unicode_mode=False;unicode_stmt=False;User ID=SYSDBA;rowset_vm_using=-1;inner_trans=False;std_exec_sp=True;exec_sp_named_param=True;' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'FIREBIRD',@useself=N'False',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'rpc', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'rpc out', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'collation name', @optvalue=null GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'FIREBIRD', @optname=N'use remote collation', @optvalue=N'true' |
Articulos Relacionados:









en
en
en
La verdad el contenido es muy bueno. Pude reducir el trabajo con algunos usp’s desde mi equipo local