Como pasar datos de un servidor remoto a otro

07/12/2007 - 17:02 por Alr | Informe spam
Tengo dos servidores Dell (uno con Win2k Server, y otro con Win 2003 R2
server, ambos con sus service pack respectivo), los dos tienen instalado
Sql2000 Standard Edition
Service Pack 4, los dos servidores estan en diferentes cuidades, en uno de
ellos se corre un sistema de pedidos. El caso es que me piden que la
informacion de este servidor
se pase al de la otra cuidad (Win 2003 R2 server, donde se encuentra la
administracion), ya que quieren ver los datos lo mas en linea que se pueda,
sin embargo me comentan
tambien que han tenido no muy buenas experiencias con el replicador de Sql,
por lo que me pidieron que usara otra cosa (aparte que nunca he implementado
un replicador), he
pensado en servidores vinculados (ya que en la cuidad donde llegaran los
datos, existe algo que hace las veces de una ip publica), de forma que si
tengo coneccion de un lado
hacia el otro (pero no hacia ambos lados).
Mi pregunta es, hay alguna forma de implementar esta situacion de forma mas
o menos simple ?
Ya que lo que se me ocurre son procedimientos almacenados que hagan las
veces de triggers (es decir que estos SP pasen los datos de un servidor al
otro), y que se ejecuten cada
digamos media hora o 1 hora, pero esto significaria tener que hacer a mano
todos los "INSERT, UPDATE y DELETE" de cada una de las tablas con sus
respectivos campos, Ejemplo:

DECLARE @Status char(1) -- <-- Ejemplo
DECLARE @Campo1 int -- etc, etc.

/* Agrega/Cambia/Borra registros en el servidor remoto segun el campo Status
del servidor Local */
DECLARE FLE_ABC CURSOR FOR SELECT [Campos] FROM [Tabla] WHERE ISNULL(STATUS,
'A') <> 'P' -- 'P' de Procesado
OPEN FLE_ABC
FETCH NEXT FROM FLE_ABC INTO [@Variables]
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Status = 'A') OR (@Status = 'B') OR (@Status = 'C') --
'A'=Alta, 'B'=Baja, 'C'=Cambio, solo los registros que no esten procesados
(Status<>'P').
BEGIN
IF (@Status = 'A') OR (@Status = 'C')
BEGIN
IF EXISTS(SELECT * FROM
[ServidorRemoto].[DbRemota].dbo.[TablaRemota] WHERE [Campo] =
[@Variable]) -- Si ya existe el registro en el servidor remoto, solo lo
actualiza
BEGIN
UPDATE [ServidorRemoto].[DbRemota].dbo.[TablaRemota]
SET [Campo1]=[@Variable1], [Campo2]=[@Variable2]
WHERE [Campo] = [@Variable] -- Y asi con todos lo campos de la tabla
END
ELSE -- Si no existe el registro en el
servidor remoto, lo agrega
BEGIN
INSERT INTO
[ServidorRemoto].[DbRemota].dbo.[TablaRemota] ([Campo1], [Campo2])
VALUES([@Variable1], [@Variable2])
END
END
ELSE
BEGIN
DELETE FROM [ServidorRemoto].[DbRemota].dbo.[TablaRemota]
WHERE [Campo] = [@Variable]
END
END
FETCH NEXT FROM FLE_ABC INTO [@Variables]
END
CLOSE FLE_ABC
DEALLOCATE FLE_ABC

Despues de esto se ejecutaria otro procedimiento almacenado (u otro proceso
dentro de este mismo SP) que ponga el campo Status = 'P', segun localize o
no los registros en la
Db del servidor remoto.


Esto como dije significa que debo hacer algo asi, para cada tabla (son como
50), aparte de agregar un campo de status a cada tabla.

No existe algo en Sql, para dar de alta/modificar el registro completo sin
tener que entrar en detalle de especificar cada campo (como es el caso del
insert, o update) ?

Alguien tiene una idea sin tener que usar replicacion (ya que esa fue la
sugerencia que me hicieron[no usar replicacion]) ?
Si quieren mas informacion con gusto la proporciono.
Espero haber explicado bien la problematica.

Cualquier idea es bienvenida.

Gracias de antemano.

Saludos.
 

Leer las respuestas

#1 Juan Carlos Inestroza Lozano
07/12/2007 - 19:35 | Informe spam
Hola

Te recomendaria usar DTS y asi verifiques los medios de tranferencia de
estos servidores y uses SQL TASk para poder empotrar las clausulas que no
permitan datos repetidas y mantegas la integridad de la BD, el escenario de
agentes de replicacion es el mas recomendado con el modelo publicados y
suscriptor!!


pero debes d etener uan buena arquitectura de comunicaciones!!!

Saludos Cordiales.


Juan Carlos Inestroza Lozano.

"Alr'" wrote:

Tengo dos servidores Dell (uno con Win2k Server, y otro con Win 2003 R2
server, ambos con sus service pack respectivo), los dos tienen instalado
Sql2000 Standard Edition
Service Pack 4, los dos servidores estan en diferentes cuidades, en uno de
ellos se corre un sistema de pedidos. El caso es que me piden que la
informacion de este servidor
se pase al de la otra cuidad (Win 2003 R2 server, donde se encuentra la
administracion), ya que quieren ver los datos lo mas en linea que se pueda,
sin embargo me comentan
tambien que han tenido no muy buenas experiencias con el replicador de Sql,
por lo que me pidieron que usara otra cosa (aparte que nunca he implementado
un replicador), he
pensado en servidores vinculados (ya que en la cuidad donde llegaran los
datos, existe algo que hace las veces de una ip publica), de forma que si
tengo coneccion de un lado
hacia el otro (pero no hacia ambos lados).
Mi pregunta es, hay alguna forma de implementar esta situacion de forma mas
o menos simple ?
Ya que lo que se me ocurre son procedimientos almacenados que hagan las
veces de triggers (es decir que estos SP pasen los datos de un servidor al
otro), y que se ejecuten cada
digamos media hora o 1 hora, pero esto significaria tener que hacer a mano
todos los "INSERT, UPDATE y DELETE" de cada una de las tablas con sus
respectivos campos, Ejemplo:

DECLARE @Status char(1) -- <-- Ejemplo
DECLARE @Campo1 int -- etc, etc.

/* Agrega/Cambia/Borra registros en el servidor remoto segun el campo Status
del servidor Local */
DECLARE FLE_ABC CURSOR FOR SELECT [Campos] FROM [Tabla] WHERE ISNULL(STATUS,
'A') <> 'P' -- 'P' de Procesado
OPEN FLE_ABC
FETCH NEXT FROM FLE_ABC INTO [@Variables]
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Status = 'A') OR (@Status = 'B') OR (@Status = 'C') --
'A'=Alta, 'B'=Baja, 'C'=Cambio, solo los registros que no esten procesados
(Status<>'P').
BEGIN
IF (@Status = 'A') OR (@Status = 'C')
BEGIN
IF EXISTS(SELECT * FROM
[ServidorRemoto].[DbRemota].dbo.[TablaRemota] WHERE [Campo] =
[@Variable]) -- Si ya existe el registro en el servidor remoto, solo lo
actualiza
BEGIN
UPDATE [ServidorRemoto].[DbRemota].dbo.[TablaRemota]
SET [Campo1]=[@Variable1], [Campo2]=[@Variable2]
WHERE [Campo] = [@Variable] -- Y asi con todos lo campos de la tabla
END
ELSE -- Si no existe el registro en el
servidor remoto, lo agrega
BEGIN
INSERT INTO
[ServidorRemoto].[DbRemota].dbo.[TablaRemota] ([Campo1], [Campo2])
VALUES([@Variable1], [@Variable2])
END
END
ELSE
BEGIN
DELETE FROM [ServidorRemoto].[DbRemota].dbo.[TablaRemota]
WHERE [Campo] = [@Variable]
END
END
FETCH NEXT FROM FLE_ABC INTO [@Variables]
END
CLOSE FLE_ABC
DEALLOCATE FLE_ABC

Despues de esto se ejecutaria otro procedimiento almacenado (u otro proceso
dentro de este mismo SP) que ponga el campo Status = 'P', segun localize o
no los registros en la
Db del servidor remoto.


Esto como dije significa que debo hacer algo asi, para cada tabla (son como
50), aparte de agregar un campo de status a cada tabla.

No existe algo en Sql, para dar de alta/modificar el registro completo sin
tener que entrar en detalle de especificar cada campo (como es el caso del
insert, o update) ?

Alguien tiene una idea sin tener que usar replicacion (ya que esa fue la
sugerencia que me hicieron[no usar replicacion]) ?
Si quieren mas informacion con gusto la proporciono.
Espero haber explicado bien la problematica.

Cualquier idea es bienvenida.

Gracias de antemano.

Saludos.



Preguntas similares