Siguiendo con los post de "tips" producto de mis constantes perdidas de tiempo en buscar alguna solución a un tema que me obligó a consumir más horas de las necesarias en algo, es que hoy les traigo este pequeño mecanismo para poder realizar una copia de un servidor a otro a través de consultas con la particularidad de que este mecanismo permite pegar información en equipos que se encuentran fuera del dominio.
Primero lo primero, xp_cmdshell es un procedimiento almacenado que permite ejecutar instrucción del tipo command (cmd para los amigos). Con este procedimiento nosotros podemos básicamente realizar cualquier operación DOS (mkdir, dir, cd xx, etc.) así como tambien la de ejecutar aplicaciones por consola o archivos .bat, el cual será nuestro caso.
Antes de pasar al código general, lo primero es habilitar (sólo si no está habilitado....
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Una vez realizado ésto, podremos llamar al procedimiento xp_cmdshell desde la base Master.GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Como comentarios generales sobre el SP y lo que gatillo éste post; Es necesario considerar que el usuario que levanta nuestro command es el mismo que el que levanta nuestro servicio sql server, por lo que si el equipo al cual se quiere transferir o copiar el archivo se encuentra fuera del dominio al que pertenece la cuenta utilizada para el servicio ó la cuenta es un usuario local, no será posible acceder a la ruta de destino y se recibirán mensajes del tipo "Invalid drive specification" o "invalid user name or password".
Luego de andar enojado por un rato tras no poder terminar lo que necesitaba se me ocurrió una alternativa para realizar la operación forzando al command a utilizar una cuenta distinta a la del servicio sin que ésto requiera modificar la configuración del servicio y obviamente no tener que reiniciar todo. Crear un archivo .bat que contiene las instrucciones de copiado y que además se identifica con un usuario distinto en el servidor de destino utilizando el comando NET.
El archivo es más o menos así y no creo que requiera de alguna explicación:
superArchivoCopiaArchivos3000.bat
net use \\servidorDestino\carpeta /user:grupoDeTrabajo\usuario password
copy "c:\archivoOrigen.txt" "\\servidorDestino\carpeta\archivoDestino.txt" /Y
Luego desde SQL podemos realizar lo siguiente para ejecutar nuestro bat
DECLARE @result int
EXEC @result = master..xp_cmdshell 'c:\superArchivoCopiaArchivos3000.bat'
RETURN @result
Y voilá! prácticamente nada de código y obviamente mejor que hacer una app o un servicio que haga este tipo de tareas ;)
Nos leemos en la próxima y recuerden que aún tengo sed!
Muy bueno, yo tambien he estado batallando y este aporte me ayudo.
ResponderEliminary para borrar los archivos que acabo de copiar del directorio origen?
ResponderEliminar