sábado, 21 de agosto de 2010

Ejecutar líneas de comando desde SQL SERVER

Varias personas me preguntaron si es posible crear archivos usando SQL de SQL Server. La respuesta es sí.
Existe el procedimiento almacenado xp_cmdshell que permite ejecutar comandos cmd.
Con xp_cmdshell usted puede crear archivos, ver directorios borrar archivos, crear carpetas, etc, etc, etc, utilizando el T-SQL de SQL Server.

Ejemplo:
En este ejemplo, voy a crear un directorio llamado Daniel en el disco c: usando el procedimiento almacenado xp_cmdshell desde el sql server management studio o alguna otra herramienta de su preferencia:

Xp_cmdshell ‘mkdir c:\daniel’
Es muy probable que usted al ejecutar el procedimiento almacenado, le salga el siguiente error:

Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

Este mensaje de error indica que este procedimiento almacenado, por defecto esta bloqueado. Por cuestiones de seguridad, se lo tiene bloqueado. Sin embargo, si el administrador de base de datos cree poder controlar que personas indeseadas no accedan al procedimiento almacenado, se lo puede habilitar de 2 maneras:

Una forma es mediante el procedimiento sp_configure:

Paso 1
--Activa las funciones avanzadas de configuracion de SQL SERVER
sp_configure 'show advanced options','1'
RECONFIGURE WITH OVERRIDE;

Paso 2
--Activa el procedimiento almacenado xp_cmdshell
sp_configure 'xp_cmdshell','1'
RECONFIGURE WITH OVERRIDE;

Una vez que se activa la opción, al correr el comando Xp_cmdshell ‘mkdir c:\daniel’, se crear una carpeta Daniel en el disco c.

La otra forma es mediante, la configuración de área expuesta. Para ver más información vea mi artículo escrito anteriormente:

Qué sucedió con la configuración de área expuesta ?

Para copiar un archivo usando xp_cmdshell

-- copia un archivo personal.bak de la carpeta e:\origen a e:\destino
xp_cmdshell 'copy e:\origen\personal.bak e:\destino'



Para crear un usuario de Windows usando xp_cmdshell
-- Crear un usuario llamado Juan con password Pa$w0rds
xp_cmdshell 'net user Juan Pa$w0rds /add'


Tienes más dudas ?. Escribe a este blog.

People who read this post also read :



8 comentarios:

  1. Hola... tengo una duda... como creo el archivo dentro de la carpeta de daniel que acabaste de crear?... asi sea un txt

    gracias

    ResponderEliminar
  2. DECLARE @cmd sysname, @variable sysname
    SET @variable = 'Mensaje de prueba'
    SET @cmd = 'echo ' + @variable + ' > c:\daniel\texto.txt'
    EXEC master..xp_cmdshell @cmd

    ResponderEliminar
  3. se pueden desbloquear otros procedimientos almacenados propios pero que perdí el origen y ahora que necesito modificarlos no me deja...

    ResponderEliminar
  4. hablas de desbloquear el procedimiento xp_cmdshell ?. Buscá en el buscador de mi blog sobre el area expuesta surface area configuration.
    Que SQL Server tienes ?.

    ResponderEliminar
  5. Que ocurre en caso de querer copiar el archivo a otro servidor?

    ResponderEliminar
  6. Para que una carpeta compartida esté en un drive que lo vamos a llamar drive k que un servidor llamado servidor 2:

    net use k: \\servidor2\carpetacompartida

    Luego usas el drive k como un disco local.

    ResponderEliminar
  7. Que tal, estoy intentando crear un archivo plano en una ubicación utilizando bpc como a continuación se describe:

    Exec Master..xp_cmdshell 'bcp "Select * From IntPruebas..Articulos where Articulo LIKE ''MO%'' " queryout "C:\testing.txt" -S SVRPROD1 -U admin -P ***** -c -t'

    Lo cual me arroja el siguiente mensaje:
    Mens 15121, Nivel 16, Estado 21, Procedimiento xp_cmdshell, Línea 1
    Error al ejecutar xp_cmdshell. Error al llamar a 'CreateProcess'; código de error: '5'.


    Lo que necesito es saber como lo puedo crear y que es lo que puedo hacer.
    Saludos-
    Abraham E.

    ResponderEliminar
  8. Está con SQL Express Edition ?
    Si no, es mejor usar un SSIS paquete en vez del comando BCP.

    ResponderEliminar