Principales respuestas
Como puedo transferir de manera automatica registros entre base de datos?

Pregunta
-
Hola a todos,
Actualmente estoy ejecutando un proyecto en donde se deben ejecutar las siguientes taresas:- Usuarios hacen login usando SSL (cada usuario pertenece a una entidad bancaria distinta)
- Usuario deben subir un archivo con numerosos registros de informacion en formato CSV o XLS (no todos los archivos contienen el mismo formato)
- Mi aplicacion debe subir este archivo a la base de datos temporal y ejecutar un script para limpiar toda la data y almacenar la informacion en una tabla master
- Esta tabla master de mi base de datos temporal debe transferir los registros a mi base de datos final (en este base de datos estan los registros que se deben mostar al cliente) y ejecutar un script para limpiar los registros actuales con los registros transferidos
- Eliminar todos los registros de la Base de datos temporal
Mis preguntas son:
- Una vez que se ejecuta perfectamente el paso numero 3 de que manera puedo transferir todos los registros a la otra base de datos de forma automatica? Debo usar service Broker para iniciar la comunicacion entre las bases de datos?
- De acuerdo a lo expuesto anteriormente, sera necesario utilizar dos bases de datos? Coloco dos bases de datos por motivos de seguridad. Esto esta bien?
- Para eliminar los registros luego que estos son transferidos, debo usar Service Broker para terminar la conversacion?
- Puedo crear bases de datos encryptadas?
- Cual seria el mejor perfomance para ejecutar estas tareas?
- La parte complicada del proyecto es que no todo los documentos que subiran a mi aplicacion contienen el mismo formato, por lo que debere crear un script distinto para cada uno de ellos.
Mis conocimiento en cuanto a Base de Datos son muy basicos pero tengo que realizar este proyecto. Cualquier sugerencia sera bienvenida.
Graciassábado, 23 de enero de 2010 16:09
Respuestas
-
Hola.En cuanto a las tareas a ejecutar, desde el paso 3 en adelante (mover los datos de csv, xls a una base de datos intermedia y de ahí luego a la definitiva), yo lo haría con varios paquetes de integration services ejecutados por jobs. Así, prepararía mi aplicación para que dejara los ficheros en distintos directorios en función del formato. Programaría jobs que cada x minutos determinaran si existe algún fichero que procesar y en ese caso se ejecutaría un dtsx que realizara el resto de pasos (mover a la intermedia, mover a la final, marcar el fichero como procesado y dejar las tablas listas para la siguiente ejecución). Creo que sería la manera de obtener el mejor rendimiento, la automatización, y resto de los requerimientos que has expuesto.En cuanto al resto de cuestiones, no usaría Service Broker en este caso. La encriptación de bases de datos se puede crear o no, pero no guarda ninguna relación con el resto de la cuestión.De todos modos, según avances, e independientemente de la forma en que finalmente lo hagas, si te tropiezas con alguna cuestión concreta, nos vas contando. La ayuda que te podemos brindar creo que es más eficaz si se trata de cosas puntuales que si se trata de orientarte en las líneas generales del desarrollo.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator sábado, 23 de enero de 2010 16:48
- Marcado como respuesta Rafael Fagundes martes, 26 de enero de 2010 12:59
- Desmarcado como respuesta VenEcDeveloper martes, 26 de enero de 2010 17:15
- Marcado como respuesta VenEcDeveloper jueves, 28 de enero de 2010 19:43
sábado, 23 de enero de 2010 16:48Moderador -
Ya encontre la forma mas eficiente de hacerlo.
Cree un procedimiento almacenado que me devuelve todos los registros desencriptados y dentro del "Connection Manager" asigno este procedimiento almacenado en el "SQL Command".
Asumo que usando este metodo el rendimiento del paquete es superior a crear archivos innecesarios.
- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator viernes, 9 de julio de 2010 20:13
viernes, 9 de julio de 2010 18:41
Todas las respuestas
-
Hola.En cuanto a las tareas a ejecutar, desde el paso 3 en adelante (mover los datos de csv, xls a una base de datos intermedia y de ahí luego a la definitiva), yo lo haría con varios paquetes de integration services ejecutados por jobs. Así, prepararía mi aplicación para que dejara los ficheros en distintos directorios en función del formato. Programaría jobs que cada x minutos determinaran si existe algún fichero que procesar y en ese caso se ejecutaría un dtsx que realizara el resto de pasos (mover a la intermedia, mover a la final, marcar el fichero como procesado y dejar las tablas listas para la siguiente ejecución). Creo que sería la manera de obtener el mejor rendimiento, la automatización, y resto de los requerimientos que has expuesto.En cuanto al resto de cuestiones, no usaría Service Broker en este caso. La encriptación de bases de datos se puede crear o no, pero no guarda ninguna relación con el resto de la cuestión.De todos modos, según avances, e independientemente de la forma en que finalmente lo hagas, si te tropiezas con alguna cuestión concreta, nos vas contando. La ayuda que te podemos brindar creo que es más eficaz si se trata de cosas puntuales que si se trata de orientarte en las líneas generales del desarrollo.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator sábado, 23 de enero de 2010 16:48
- Marcado como respuesta Rafael Fagundes martes, 26 de enero de 2010 12:59
- Desmarcado como respuesta VenEcDeveloper martes, 26 de enero de 2010 17:15
- Marcado como respuesta VenEcDeveloper jueves, 28 de enero de 2010 19:43
sábado, 23 de enero de 2010 16:48Moderador -
Ok, me parece bien, puedo hacerlo de esta forma. Se ve mas sencillo de programar y conozco de Integration Services.
Ahora bien, me surgen unas nuevas preguntas:- Es posible que pueda ejecutar un job cuando ocurra un evento desde mi aplicacion. Por ejemeplo: cuando hage click en un boton se puede ejecutar el job?
- Como sabe mi base de datos intermedia cuando transferir los datos a mi base de datos final? Tengo que crear jobs que se ejecuten cada x minutos para verificar mis ficheros?
- La creacion de jobs ejecutandose cada x minutos no disminuye el perfomance de mi servidor?
- La idea de ejecutar estas tareas es que el usuario pueda ver en un progress bar que se esta ejecutando algo por detras y que de alguna forma pueda ver las cantidad de registros que fueron agregados a la base de datos. Seria posible lograr esto haciendo estos pasos?
sábado, 23 de enero de 2010 17:18 -
Hola.Respondiendo por orden:A la pregunta 1: Sí, es posible (ejecutando sp_start_job, mira en los Books Online). Pero no lo haría de ese modo. Prepararía un job que verificara cada poco tiempo la existencia de determinado fichero en una ruta. Si encuentra un fichero, se ejecutaría el dtsx que lo procesa.A la pregunta 2: No hace falta que tu base de datos intermedia lo sepa. El dtsx debe realizar todos los pasos (del fichero a la bd intermedia y de la intermedia a la final, sin pausas de por medio). Sí, debes crear un job para cada tipo de fichero.A la pregunta 3: La ejecución de jobs tiene un impacto en el rendimiento, pero es muy leve. Si sólo han de realizar la verificación, lo normal será que no haya nada que procesar. Si el flujo de ficheros fuera muy alto, lo que tendría impacto sería el procesamiento de los ficheros. Comparado con eso, el imple.acto de la propia verificación es despreciable.A la pregunta 4: No. Como la mayoría de los procesos ETL, lo que yo he expuesto sirve como un proceso de back office. Eso no significa que no pueda lograrse. Por ejemplo, puedes crear un programa que ejecute el paquete de integration services, incluso puedes preparar un programa que cree ese paquete en tiempo de ejecución, y lo ejecute, permitiéndote saber cómo está produciéndose el flujo. Pero estamos hablando de algo bastante más complejo y que nada tiene que ver con todo lo anterior. Si apuestas por esa vía, antes deberías lograr lo mismo con procesos ya creados y ejecutados por jobs.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator domingo, 24 de enero de 2010 20:46
- Marcado como respuesta Rafael Fagundes martes, 26 de enero de 2010 12:59
- Desmarcado como respuesta VenEcDeveloper martes, 26 de enero de 2010 17:14
domingo, 24 de enero de 2010 20:46Moderador -
OK, entonces estas serian las actividades a seguir:
- Crear un folder para cada tipo de fichero (.txt, .xls, .csv)
- Crear un job que se ejecute cada x tiempo y verifique si existe algun fichero del item 1
- Ejecutar un DTS para limpiar data en la base de datos intermedia, mover data a la base de datos final, cambiar nombre al fichero como procesado, eliminar el fichero original.
Otras dudas que me surgen son:
- Es recomendable utilizar un DTS distinto para cada actividad del ultimo paso?
- Estoy usando SQL Server 2008, No hay problemas utilizar los pasos en esta version de SQL Server?
- Es posible que la base de datos este encryptada? o en su defecto, los registros de la base de datos?
Muchas gracias por la ayuda y disculpa tantas preguntas pero SQL Server no es mi area pero hay que hacerlo.
martes, 26 de enero de 2010 17:14 -
Hola.A la pregunta 1: No. Es mejor hacer un único dtsx (no confundir con DTS de SQL Server 2000, estos no los uses que haga todos los pasos. Haz uno para cada tipo de fichero.A la pregunta 2: Ningún problema en ello.A la pregunta 3: Sí, es posible. Esto no guarda relación con lo anterior, en cualquier caso no hay ninguna incompatibilidad en ello.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator miércoles, 27 de enero de 2010 8:10
miércoles, 27 de enero de 2010 8:10Moderador -
Hola,
Despues de tanto tiempo finalmente se decidieron que el uso de SSIS e sla mejor manera de resolver los requerimientos.
Ya cree mi dtsx que extrae el fichero de una carpeta en mi servidor y almacena los datos de forma encryptada en mi base de datos intermedia.
Ahora estoy creando otro dtsx que debe transferir los datos de la base de datos intermedia mi base de datos final. La transferencia esta perfecta solo que no se como desencriptar mis datos antes de transferir todos los registros. Sera recomendable desencriptar mis datos a un archivo XML y luego utilizar este archivo XML como mi fuente de datos para comenzar la transferencia? o existe alguna manera mas rapida y eficaz de realizar esta tarea?
Gracias por la ayuda
jueves, 8 de julio de 2010 20:16 -
Hola.
¿Cómo lo estás encriptando? Eso será lo que tengas que hacer para desencriptarlo.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)jueves, 8 de julio de 2010 21:08Moderador -
La parte de encriptar y desencriptar esta funcionando. Me gustaria saber en que parte del dtsx yo deberia desencriptar la data? Antes de hacer la trasnferencia creando un archivo xml con la data desencriptada o justo cuando se esta haciendo la transferencia. En el segundo caso no tengo idea de como hacerlo.
Sera que creando un archivo Xml es la manera mas optima?
Para encriptar y desencriptar estoy usando:
OPEN
SYMMETRIC KEY, DECRYPTION BY CERTIFICATE
jueves, 8 de julio de 2010 21:45 -
Hola.
Desde luego que al vuelo es más complicado, así que hazlo antes, que de hecho ya sabes cómo hacerlo. Si el rendimiento no es el que esperas, danos algún detalle más del proceso, a ver si se puede mejorar algo en algún punto.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)viernes, 9 de julio de 2010 17:21Moderador -
Ya encontre la forma mas eficiente de hacerlo.
Cree un procedimiento almacenado que me devuelve todos los registros desencriptados y dentro del "Connection Manager" asigno este procedimiento almacenado en el "SQL Command".
Asumo que usando este metodo el rendimiento del paquete es superior a crear archivos innecesarios.
- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator viernes, 9 de julio de 2010 20:13
viernes, 9 de julio de 2010 18:41