Foros del Web » Programación para mayores de 30 ;) » .NET »

Extraer diferencias entre tablas

Estas en el tema de Extraer diferencias entre tablas en el foro de .NET en Foros del Web. Hola a tod@s! Tengo que hacer una pequeña aplicación que haga una especie de copia de seguridad de una base de datos y envíe, via ...
  #1 (permalink)  
Antiguo 19/12/2004, 08:40
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Pregunta Extraer diferencias entre tablas

Hola a tod@s!
Tengo que hacer una pequeña aplicación que haga una especie de copia de seguridad de una base de datos y envíe, via web, los datos que han ido cambiando a un servidor común (para no tener que enviar todas la tablas enteras)

Había pensado añadir unos triggers en cada tabla para que almacenase en una tabla temporal las inserciones, borrados y actualizaciones que se iban produciendo y envíar eso, pero no puedo porque no me permiten tocar nada de esa base de datos

Alguien me puede orientar sobre como hacerlo? espero que me podáis sacar de esta jeje.

Saludos
  #2 (permalink)  
Antiguo 19/12/2004, 23:48
 
Fecha de Ingreso: diciembre-2004
Mensajes: 130
Antigüedad: 19 años, 4 meses
Puntos: 0
Difícil labor sin poder ser óptimos.

Ya que no puedes manipular para nada el servidor de base de datos, podrías manipular el funcionamiento de la aplicación que realiza las transacciones sobre la base de datos para llevar a cabo la tarea (pero si hay una manera mucho más sencilla de realizar la tarea, para que complicarse).

Lo que podrías proponer es crear una copia de la base de datos y hacer tus pruebas ahí (además de una copia de backup). Ya después ir probando en el servidor de producción.
__________________
langdotnet
  #3 (permalink)  
Antiguo 20/12/2004, 01:35
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Hola lang.net, gracias por contestar. El problema es que TAMPOCO puedo modificar la aplicación que maneja esa base de datos.

Es decir, a ver si me explico mejor, tenemos una aplicación en varios establecimientos que maneja las ventas, pedidos, etc que funciona contra una BD SQL Server (una distinta por cada establecimiento), yo no puedo tocar nada de eso, pero queremos crear una BD "paralela" a estas en la que cada noche se vayan enviando las modificaciones que se han llevado a cabo.

Más o menos la idea está en extraer las diferencias existentes entre la BD actual del establecimiento y la última actualización de esta que tengamos en el servidor central. Comparar registro a registro no me parece nada optimo claro, y no sé ni por donde pillarlo.

Saludos
  #4 (permalink)  
Antiguo 20/12/2004, 02:44
 
Fecha de Ingreso: diciembre-2004
Mensajes: 130
Antigüedad: 19 años, 4 meses
Puntos: 0
Hola.

Hacer las diferencias entre cada una de las BD de los establecimientos y la BD central también es un poco pesado.

Mira en cada uno de los establecimientos tendrías que poder distinguir las transacciones del día ... (select * from table1 where fecha>=getdate())

- Al final del día, tendrías que ejecutar un programa (winform) que genere una secuencia SQL a ser ejecutada en el servidor de base de datos central (puedes usar el Interop de SQLSERVER)

- Otra opción seria la creación de un Web Service que pueda recibir los datos de las transacciones realizadas en el día por cada establecimiento, este Web Service almacenaría los datos en el servidor de base de datos central


No conozco la arquitectura de red que maneje la corporación, pero espero que las pautas que te envió sirvan de algo.

Saludos cordiales.
__________________
langdotnet
  #5 (permalink)  
Antiguo 20/12/2004, 02:58
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Gracias de nuevo lang.net, pero sigue habiendo un problema, las ventas por ejemplo, tienen fecha, pero si añaden un artículo o lo modifican eso no se refleja en ningún sitio con una fecha, mi problema está ahí, que tengo que comparar una tabla con otra y además quizá registro a registro por si han modificado algo!!!! me parece una exageración pero no le veo solución

Saludos
  #6 (permalink)  
Antiguo 20/12/2004, 03:40
 
Fecha de Ingreso: diciembre-2004
Mensajes: 130
Antigüedad: 19 años, 4 meses
Puntos: 0
Todo tiene solución mi estimado, lo único que no tiene solución es la muerte...

Para sacar las diferencias entre las tablas podrías trabajar con cursores...


Saludos
__________________
langdotnet
  #7 (permalink)  
Antiguo 20/12/2004, 04:05
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Podrías ilustrarme sobre cursores lang.net, no tengo mucha idea, conoces algún link o documento que pueda ayudarme?

Gracias, me estás salvando la vida jeje.
  #8 (permalink)  
Antiguo 20/12/2004, 04:53
 
Fecha de Ingreso: diciembre-2004
Mensajes: 130
Antigüedad: 19 años, 4 meses
Puntos: 0
Hola nuevamente...

Ya, te mando un código que no esta muy optimizado que digamos, pero como ejemplo sirve....

En el analizador de consultas ejecuta ...

Código:
--backup del día anterior
create table #articulos_AYER
(
	id integer identity(1,1) not null,
	nombre varchar(30) not null,
	precio decimal not null
);

insert into #articulos_AYER(nombre,precio) values('MONITOR',180);
insert into #articulos_AYER(nombre,precio) values('TECLADO',10);
insert into #articulos_AYER(nombre,precio) values('MOUSE',5);
insert into #articulos_AYER(nombre,precio) values('IMPRESORA',315);

--Datos del día
create table #articulos_HOY
(
	id integer identity(1,1) not null,
	nombre varchar(30) not null,
	precio decimal not null
);

insert into #articulos_HOY(nombre,precio) values('MONITOR',180);
insert into #articulos_HOY(nombre,precio) values('TECLADO',10);
insert into #articulos_HOY(nombre,precio) values('MOUSE',8);
insert into #articulos_HOY(nombre,precio) values('IMPRESORA',300);
Seguido de .... (No al mismo tiempo, pero si en la misma ventana)
Código:
--Comprobación de variaciones

declare @id_ayer integer
declare @nombre_ayer varchar(30)
declare @precio_ayer decimal

declare cursor_ayer cursor for 
	select id, nombre, precio from #articulos_AYER

open cursor_ayer

fetch next from cursor_ayer
into @id_ayer, @nombre_ayer, @precio_ayer

while @@fetch_status = 0
	begin
		--INICIO
		declare @id_hoy integer
		declare @nombre_hoy varchar(30)
		declare @precio_hoy decimal
		
		declare cursor_hoy cursor for 
			select id, nombre, precio from #articulos_HOY
		
		open cursor_hoy
		
		fetch next from cursor_hoy
		into @id_hoy, @nombre_hoy, @precio_hoy

		while @@fetch_status = 0
		begin
			if(@precio_ayer=@precio_hoy)
			begin
				print('El precio de AYER es: '+cast(@precio_ayer as varchar))
				print('El precio de HOY  es: '+cast(@precio_hoy as varchar))
			end
			fetch next from cursor_hoy
			into @id_hoy, @nombre_hoy, @precio_hoy
		end

		deallocate cursor_hoy
		--FIN

		fetch next from cursor_ayer
		into @id_ayer, @nombre_ayer, @precio_ayer
	end
deallocate cursor_ayer
Esos son cursores anidados ...

Me vas a disculpar por el código, pero despues de 3 días de amanecidas lo único que quiero es dormir ....

Ya despues me conecto ... espero novedades...



Saludos cordiales.
__________________
langdotnet
  #9 (permalink)  
Antiguo 20/12/2004, 05:06
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Muchas gracias lang.net, lo miraré detenidamente esta tarde y mañana te contaré si lo he podido llevar a cabo sin problemas

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:39.