on 04-08-2016 5:52 PM
Buen día compañeros.
Tengo un caso que no he podido resolver; por medio del Transaction Notification necesito validar cierta información de un server a otro, para una mejor ejemplificación les comparto la línea de código:
SET @codigoClienteEnMatriz = ISNULL((Select T0.CardCode From [Server1].[bdCON].[dbo].[OCRD] T0 Where T0.CardCode = @list_of_cols_val_tab_del),'NO EXISTE')
Para esto, el servidor "Server1" ya ha sido añadido como servidor vinculado con sus respectivos permisos de acceso a datos pero cuando ocasiono que se dispare la validación del TN desde SAP, el sistema me arroja el siguiente error:
[Microsoft][SQL Server Native Client 11.0][SQL Server]No se pudo realizar la operación porque el proveedor OLE DB "SQLNCLI11" del servidor vinculado "Server1" no pudo iniciar una transacción distribuida. (CINF)
Si ejecuto una consulta normal, por ejemplo Select * FROM Server1.bdCON.dbo.OCRD T0, el sistema me arroja los datos sin problema alguno pero al hacer consultas al server por medio del Transaction Notification, me arroja dicho mensaje.
Tal vez es algo sencillo pero mi conocimiento en SQL Server no es muy nutrido.
Gracias por cualquier aporte.
Hola Gerardo, los servidores linkeados tienen las mismas características?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola Julian.
No, el servidor desde donde ejecuto la consulta es:
Windows Server 2012
SQL Server 2014
Y el servidor al cual consulto es:
Windows server 2008
SQL Server 2008
Lo más viable que he encontrado es habilitar esta opción en el Firewall:
Pero mi desconocimiento sobre SQL Server me hace dudar en hacerlo ya que se trata de mi servidor productivo de Business One.
Normalmente estos problemas se dan por el linkeo de servidores de caracteristicas diferentes, de igual forma solo uno debe fungir como promotor como se le llama en las cuestiones de REPLICAS o TRANSACCIONES REMOTAS. Existen un SP que puedes localizar inclusive en documentos de SQL en la red para que te quede mas claro el escenario.
Puedes probarlo en un server test si gustas, en lo personal a mi me ha funcionado de maravilla.
Te voy a compartir un script mas completo que aplica para todos tus linkserver.
DECLARE @ServerName SYSNAME
, @Message nvarchar(1000)
, @CMD1 nvarchar(max)
--
DECLARE @Server_List Table
( SrvID SMALLINT
, SrvName SYSNAME )
--
Set NoCount ON
--
-- Load up linked server list
--
BEGIN
INSERT INTO @Server_List (SrvID, SrvName)
SELECT SrvID
, SrvName
FROM [master].[SYS].sysservers
ORDER BY SrvID ASC
END
--
SELECT TOP 1 @ServerName = SrvName
FROM @Server_List
ORDER BY SrvID ASC
--
-- Loop through the Linked Server List
--
WHILE EXISTS ( SELECT * FROM @Server_List )
BEGIN
SELECT @Message = 'Server Name is '+ @ServerName
--
RAISERROR (@Message, 10,1) WITH NOWAIT
--
SET @CMD1 = 'EXEC master.dbo.sp_serveroption @server=N'''
+ @ServerName
+ ''', @optname=N''rpc'', @optvalue=N''true'''
Exec sp_executesql @cmd1
--
SET @CMD1 = 'EXEC master.dbo.sp_serveroption @server=N'''
+ @ServerName
+ ''', @optname=N''rpc out'', @optvalue=N''true'''
Exec sp_executesql @cmd1
--
set @cmd1 = 'EXEC master.dbo.sp_serveroption @server = '''
+ @ServerName
+ ''', @optname=N''remote proc transaction promotion'', @optvalue=N''false'''
Exec sp_executesql @stmt=@cmd1,@params=N''
--
DELETE FROM @Server_List WHERE SrvName = @ServerName
--
SELECT TOP 1 @ServerName = SrvName
FROM @Server_List
ORDER BY SrvID ASC
--
END
Adicional valida esto:
Bueno, después de intento tras intento, con lo que se menciona en el siguiente Blog, he logrado cumplir mi objetivo:
Configure MSDTC for Distributed Transactions | Irina Tudose's blog
Gracias por el apoyo.
User | Count |
---|---|
100 | |
12 | |
11 | |
6 | |
6 | |
4 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.