SQL Server - Trigger que actualiza sevidores vinculados

 
Vista:

Trigger que actualiza sevidores vinculados

Publicado por Ariel Leon (1 intervención) el 14/10/2008 20:12:02
Hola, espero que me puedan ayudar, este es mi problema:

Necesito crear un Trigger en la TablaX para Insert, Delete y Update, de tal forma que
al momento de actualizar la TablaX tambien se actualice la TablaX en el mismo Server pero
en otra Base de Datos y que tambien se actualice la TablaX pero de otro Server. Para esto
Cree un Servidor Vinculado de la siguiente forma:

Los 2 Servidores Tienen Sql Server 2000, estan en la misma red y pueden verse e intercambiar
datos

En el Server1 vincule el server2 de la siguiente forma:

sp_addlinkedserver @server = 'Server2'
@srvproduct = 'ServerLink' ]
,@provider = 'SQLOLEDB'
,@datasrc = 'IP'
,@provstr = 'Driver={SQL Server}; SERVER=IP;UID=******;PWD=******;'
,@catalog = 'Db'

Habilite las siguientes opciones en el Server1

EXEC sp_serveroption Server1, 'data access', 'TRUE'
EXEC sp_serveroption Server1, 'rpc', 'TRUE'
EXEC sp_serveroption Server1, 'sub', 'TRUE'
EXEC sp_serveroption Server1, 'rpc out', 'TRUE'
EXEC sp_serveroption Server1, 'use remote collation', 'TRUE'

Hice lo mismo en el Server2: vincule el Server1

sp_addlinkedserver @server = 'Server1'
@srvproduct = 'ServerLink' ]
,@provider = 'SQLOLEDB'
,@datasrc = 'IP'
,@provstr = 'Driver={SQL Server}; SERVER=IP;UID=******;PWD=******;'
,@catalog = 'Db'

y Habilite las siguientes opciones en el Server2
EXEC sp_serveroption Server2, 'data access', 'TRUE'
EXEC sp_serveroption Server2, 'rpc', 'TRUE'
EXEC sp_serveroption Server2, 'sub', 'TRUE'
EXEC sp_serveroption Server2, 'rpc out', 'TRUE'
EXEC sp_serveroption Server2, 'use remote collation', 'TRUE'

los dos servidores contienen el mismo usuario y pass, tienen las mismas opciones habilitadas,
los 2 tienen acceso a las tablas del otro, desde el Server1 puedo ejecutar una consulta a una
tabla del Server2 (Select * From Server2.Db.Dbo.Tabla1)
y en el Server2(Select * From Server1.Db.Dbo.Tabla1) y ambas consultas me regresan datos.

Este es el Trigger que Cree en el Server1:

-- Db= Data Base.
Create Trigger TriggerInsert On Server1.Db1.TablaX
For Insert
AS
--------- Disparador al hacer un Insert en la tabla CatTiendas
Insert Into Server1.Db2.Dbo.TablaX (Campo1, Campo2, Campo3)
Select Campo1, Campo2, Campo3
From Inserted

Insert Into Server2.Db.dbo.TablaX (Campo1, Campo2, Campo3)
Select Campo1, Campo2, Campo3
From Inserted

En el Server1 intento la siguiente operacion:

Insert Into TablaX (Campo1, Campo2, Campo3)
Select 1, 'Dato 1', 'Dato 2'
Union
Select 2, 'Dato 3', 'Dato 4'

Al ejecutar la operacion Se dispara el Trigger y despues de unos 30 Min (es demaciado tiempo) me arroja el siguiente error:

Server: Msg 7391, Level 16, State 1, Procedure TriggerCiudadesInsert, Line 17
The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.
[OLE/DB provider returned message: Error en la conexión]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d01c].

Tambien intente creando un procedimiento en el Server2 y mandarlo ejecutar desde el Server1
dentro del Trigger pero me marca el mismo error de arriba despues de 30 Min que dura en ejecucion.

EXEC OPERA.creditoycasa.dbo.sp_executesql
@stmt = N'exec SpcPruebaLinkServer244'

no se si sea problema de las transacciones distribuidas ya que eso es lo que marca pero no se como lo
puedo corregir. Si me pudieran decir que es lo que me hace falta o que es lo que estoy haciendo mal
se los agradeceria infinitamente. esto de los servidores vinculados es nuevo para mi y no tengo mucha experienia en eso.

Gracias por su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Trigger que actualiza sevidores vinculados

Publicado por Isaias (3308 intervenciones) el 15/10/2008 02:58:30
Ejecuta

SP_CONFIGURE

Revisa que RPC tenga 1 (run)

Por otro lado, cuando haces insert a otor servidor, debes utilizar UNC para nombrar tus objetos

SERVER.BASE.OWNER.TABLA (objeto)

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar