cancel
Showing results for 
Search instead for 
Did you mean: 

[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 "XXXXX" no pudo iniciar una transacción distribuida. (CINF)

gerardo_mendez
Active Contributor
0 Kudos

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.

Accepted Solutions (1)

Accepted Solutions (1)

former_member188471
Active Contributor
0 Kudos

Hola Gerardo, los servidores linkeados tienen las mismas características?

gerardo_mendez
Active Contributor
0 Kudos

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.

former_member188471
Active Contributor
0 Kudos

Corre este script

EXEC sp_serveroption @server = 'ServerB',@optname = 'remote proc transaction promotion', @optvalue = 'false'

gerardo_mendez
Active Contributor
0 Kudos

Gracias Julian.

En mi empresa son un poco meticulosos con las cuestiones de seguridad, ¿Tienes conocimiento sobre qué implica ejecutar este script?

Agradezco tu apoyo.

former_member188471
Active Contributor
0 Kudos

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.

gerardo_mendez
Active Contributor
0 Kudos

Muchas gracias por el asesoramiento.

He corrido el Script en un server de prueba pero aun sigue mandando el mismo mensaje, esperare que no haya usuarios conectados para reiniciar ambos servers y ver si con eso bastara.

Gracias compañero.

former_member188471
Active Contributor
0 Kudos

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:

http://connect.microsoft.com/sqlserver/feedback/details/243725/linked-server-sourceserver-was-unable...

gerardo_mendez
Active Contributor
0 Kudos

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.

Answers (0)