Como validar sucesso ou erro na chamada do xp_cmdshell do SQL Server

PessoALL, tudo tranquilo?

Hoje deixo uma dica extremamente simples mas que ajuda e muito na identificação de rotinas com erro.

Primeiramente apenas gostaria de deixar claro que não sou grande fã do uso do xp_cmdshell e muitas vezes as rotinas desenvolvidas que utilizam essa feature deveriam ser executadas por outra ferramenta e não o SQL Server (ou outro SGBD usando tecnologia parecida).

Pra quem não conhece o XP_CMDSHELL possibilita a execução de utilitários dentro do Windows (Linux? Num futuro?). Imagine você no cmd (DOS?) do Windows, imaginou? Estamos praticamente falando da mesma coisa usando xp_cmdshell.

Por padrão ele não vem habilitado, isso por que até a Microsoft entende que pode ser um grande problema no fator segurança em isolamento S.O vs SGBD. Ele faz parte do conteúdo disponível nas “opções avançadas” da configuração da instância. Então pra habilitar o recurso você precisa executar os comandos abaixo.

exec sp_configure 'advanced option', 1
reconfigure

exec sp_configure 'xp_cmdshell', 1
reconfigure

Uma vez que o recurso está habilitado…. vamos usa-lo.

Vamos com o clássico “dir”.

xp_cmdshell_dir

Na imagem acima vemos o “output” trazendo as informações retornadas pelo “dir”. Apenas pontuando que output e return value são coisas diferentes.

O valor de retorno do xp_cmdshell será o errorlevel gerado pelo seu shell (input execução). Em outras palavras….. quando a execução do conteúdo passado ao xp_cmdshell gerar erro (errorlevel diferente de 0) este irá o valor de erro (que é 1).

Exemplificando usando o comando “cd”. Abaixo temos a realização de acesso a pasta C:\Windows com sucesso (return 0) e acesso a pasta C:\WWWWindows com erro (return 1) uma vez que a pasta não existe.

return_success_xp_cmdshell

return_error_xp_cmdshell

Observe com atenção que não é gerado um erro ou EXCEPTION no SQL Server durante tentativa de acesso ao caminho que não existe. Isso não serve só para “cd” mas tantos outros utilitários, BCP utility e Dtexec utility possuem o mesmo comportamento.

Você consegue realizar a validação via T-SQL conforme abaixo.

declare @value_result tinyint
exec @value_result = xp_cmdshell 'cd C:\WWWWindows'

if(@value_result <> 0)
begin
	print 'ERRO'
end
else
begin	
	print 'SUCESSO'
end

Se você precisa gerar uma EXCEPTION é só lançar um RAISERROR.

exception_xp_cmdshell

Então se você utiliza o SQL Server e xp_cmdshell. Seja para mover arquivos, compactar arquivos, deletar arquivos, executar pacotes de DTS (Dtexec.exe), fazer BCP e muitas outras atividades. Recomendo adicionar essa validação, assim quando a atividade executada pelo xp_cmdshell falhar, você ficará sabendo!

Por agora é só….. e como de costume vou atualizando o post, corrigindo erros de português e etc conforme o tempo. Abs!

Esse post foi publicado em SQLServer e marcado , , , , , , , , . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s