post icon

Configurar Linked Server con SQL Server y Firebird

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

VER SERVIDOR VINCULADO

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;

NUEVO LS

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.

Opciones de Servidor

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'

Comentarios desde Facebook:

  1. avatar
    GuxAlexander MEXICO Internet Explorer Windows
    24 Febrero 2011 at 00:28 #

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

Trackbacks/Pingbacks

  1. Configurar Linked Server desde SQL Server a Oracle | DevTroce.com UNITED STATES WordPress - 17 Diciembre 2012

    […] atrás vimos como configurar los servidores vinculados desde SQL Server con MySQL y Firebird hoy nos toca hacerlo con […]

  2. Configurar Servidor Vinculado en SQL Server con MySQL | DevTroce.com WordPress - 13 Agosto 2010

    […] = 'compact';ShareEl año pasado habíamos visto como crear un servidor vinculado en SQL Server con Firebird, en ésta oportunidad veremos como hacerlo con MySQL, son muy parecidos los pasos a seguir, pero […]

Responder