none
Ejecutar .vbs desde SQL Server RRS feed

  • Pregunta

  • Saludos, necesito ejecutar un archivo .vbs desde un trigger en SQL Server 2005, uso xp_cmdshell, el proceso wscript.exe veo que se ejecuta desde el administrador de tareas pero sin el mismo resultado que ejecutando directamente desde DOS, si alguien me puede ayudar.. 

    Muchas gracias.


    lunes, 27 de agosto de 2012 8:23

Respuestas

  • Hola.

    Creo que la mejor ayuda que te podemos ofrecer es convencerte para que no lleves a cabo esto que te propones (ejecutar un programa externo de código no manejado desde un trigger), ya que entraña numerosos riesgos desde distintos puntos de vista.

    ¿Puedes explicar qué funcionalidad te está requiriendo hacer tal cosa? ¿Qué se realiza con el script?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 8:27
    Moderador
  • Hola.

    Alternativas hay varias. Lo habitual es cargar una tabla de staging que sea procesada periódicamente (con un job, o con una tarea programada, ya que es un programa), ya que de ese modo, las credenciales con las que se lanzan son unas diferentes, más elevadas. Sin saber qué se hace en el vbs, difícil recomendar una u otra.

    Sobre que deba funcionar o no, ese es otro capítulo, con los requerimientos que hacen falta para que funcionen este tipo de cosas, que además lo hagan dentro de un trigger es complicado, aunque se pueda, insisto en que no es nada recomendable.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 9:02
    Moderador

Todas las respuestas

  • Hola.

    Creo que la mejor ayuda que te podemos ofrecer es convencerte para que no lleves a cabo esto que te propones (ejecutar un programa externo de código no manejado desde un trigger), ya que entraña numerosos riesgos desde distintos puntos de vista.

    ¿Puedes explicar qué funcionalidad te está requiriendo hacer tal cosa? ¿Qué se realiza con el script?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 8:27
    Moderador
  • Necesito ejecutarlo cada vez que se inserte un registro en la base de datos, con el valor del nuevo registro lo uso como parametro para la funcionalidad del vbs.

    Aunque no sea recomendable, deberia funcionar no? ¿Que alternativas hay?

    lunes, 27 de agosto de 2012 8:51
  • Hola.

    Alternativas hay varias. Lo habitual es cargar una tabla de staging que sea procesada periódicamente (con un job, o con una tarea programada, ya que es un programa), ya que de ese modo, las credenciales con las que se lanzan son unas diferentes, más elevadas. Sin saber qué se hace en el vbs, difícil recomendar una u otra.

    Sobre que deba funcionar o no, ese es otro capítulo, con los requerimientos que hacen falta para que funcionen este tipo de cosas, que además lo hagan dentro de un trigger es complicado, aunque se pueda, insisto en que no es nada recomendable.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 9:02
    Moderador
  • Buenas y muchas gracias por tu ayuda, de momento me conformo con que me funcione lo siguiente

    Set cloner = CreateObject("WScript.Shell")
    cloner.run"cmd"
    WScript.Sleep 500

    cloner.SendKeys"ren C:\prueba.txt pruebaOK.txt"
    cloner.SendKeys("{Enter}")
    WScript.Sleep 500

    Por otra parte consigo que me funcione un vbs que crea un archivo, osea que descartamos temas de permisos.

    Yo necesito que sea en el momento, y con la tabla de staging seria una comprobacion cada cierto tiempo no?

    Un saludo y muchas gracias

    lunes, 27 de agosto de 2012 9:58
  • Hola.

    Sin ser un experto, ¿tu objetivo es renombrar un fichero? Si es así, puedes perfectamente prescindir del script de vb y realizarlo directamente con xp_cmdshell:

    exec xp_cmdshell 'ren C:\prueba.txt pruebaOK.txt'

    En cualquier caso, varias cosas adicionales. No guardes ficheros que no son de SQL Server en el servidor de bases de datos. No uses la raíz de los directorios (menos aún el volumen C:) para realizar operaciones porque te encontrarás con problemas de elevación de permisos.

    Y por último, háblanos de la funcionalidad y de cómo se ejecuta. Esto es, qué haría que se inserte ese registro. Siempre será mejor realizar esta operación de ficheros desde la aplicación que desde SQL Server, además de ser más sencillo y mucho más seguro. Si obligatoriamente hubiera de ejecutarlo SQL Server, es preferible que lo hagas en un procedimiento almacenado que realice la inserción del registro y, fuera de transacción, el renombrado del fichero. Este sería el último recurso y te va a requerir que el usuario que tenga que hacer la inserción en la aplicación o aplicaciones sea administrador del servidor de bases de datos, esto es, algo fuera de lugar.

    Si ninguna de las alternativas te valiera, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 12:46
    Moderador
  • Buenas.

    Perdon, el ejemplo no es lo que necesito hacer pero es una prueba, que no consigo que funcione. El tema es el siguiente, un usuario inserta un registro en la base de datos, cuando cierto campo de ese registro tenga valor X. se ejecuta un trigger que llama al archivo *.vbs, este archivo lo que hace es conectarse a un terminal y a traves de ciertos comandos asigna un numero a una cola, este proceso debe ser en el momento de insertar el registro en la base de datos.

    Este es parte de mi codigo.

    Set cloner = CreateObject("WScript.Shell")
    cloner.run"cmd"
    WScript.Sleep 500

    cloner.SendKeys"telnet X.X.X.X X"
    cloner.SendKeys("{Enter}")
    WScript.Sleep 500

    cloner.SendKeys"action: login"
    cloner.SendKeys("{Enter}")
    WScript.Sleep 500

    ...


    lunes, 27 de agosto de 2012 14:17
  • Hola.

    No lo hagas con un trigger, no es un proceso online desde el momento que estás empleando colas. Prepara un job que se ejecute con la frecuencia que necesites (y cada minuto creo que te serviría), que evalúe los registros que cumplan las características requeridas y llame al script.

    Tampoco dices cómo realiza la inserción el usuario. Lo digo porque SQL Server, aunque puede, no está para ejecutar un telnet, es una cuestión ajena al motor. Sería mucho más sencillo que realizaras esto desde la aplicación que realiza la inserción, modificándola para que tras hacer la inserción, haga las operaciones de tu script.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    lunes, 27 de agosto de 2012 14:55
    Moderador
  • De todas formas, aunque haga un job seguiria teniendo el mismo problema y es que no consigo ejecutar mi script desde la base de datos.

    Muchisimas gracias por tu ayuda.

    martes, 28 de agosto de 2012 9:22
  • Hola.

    Desde Management Studio, con un usuario con permisos para ejecutar "xp_cmdshell", si ejecutas el script, ¿qué resultado obtienes?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 28 de agosto de 2012 9:40
    Moderador
  • Ejecutando el script con xp_cmdshell, y con usuario con permisos desde una consulta, obtengo que la consulta se ha realizado correctamente.
    martes, 28 de agosto de 2012 10:09
  • Hola.

    ¿Puedes o no puedes ejecutar el script? Has dicho una cosa y la contraria en los últimos dos post. Si puedes con Management Studio, puedes con un job. Si con un job obtienes un error, dinos exactamente cuál es.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 28 de agosto de 2012 12:24
    Moderador
  • Perdon, lo puedo ejecutar, no tengo ningun error en la ejecucion, pero no hace nada esa ejecucion desde SQL Server.

    Otra opción que tengo es crear un .exe que haga lo mismo, supongo que tendría el mismo problema...

    martes, 28 de agosto de 2012 13:46
  • Hola.

    ¿Qué es "no hace nada"? ¿Se queda esperando indefinidamente? ¿Ves el proceso en el Task Administrator del servidor? Supongo que el proceso no será interactivo, esto es, no requerirá una respuesta del usuario, porque en ese caso, obviamente, no finalizará nunca.

    Lo más frecuiente en estos casos es que salte el UAC, que impide la ejecución del proceso hasta la confirmación de elevación de permisos. Revisa ese aspecto también, esto es, que si cuando haces "doble click" sobre el script, este se ejecuta sin más y finaliza.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 28 de agosto de 2012 14:04
    Moderador
  • Se ejecuta y finaliza pero no obtengo el mismo resultado que haciendo "doble click", y si veo el proceso desde el Task Administrator.

    Al final he creado un .exe que hace lo mismo que el .vbs y se ejecuta correctamente desde la base de datos.

    Muchas gracias por todo.

    martes, 28 de agosto de 2012 14:56