Criando e Executando um assembly pelo SQL Server
5 de setembro de 2013 Deixe um comentário
Fala Galera,
Todos sabemos que a linguagem T-SQL possui limitações, alguma vez você já precisou fazer algum processo muito elaborado e acabou esbarrando em alguma delas?
Pois é, saiba que o SQL Server possuí uma integração com linguagens de programação, Visual Basic e C#, o que nos permite utilizar todas suas vantagens.
Vamos inciar criando uma nova base de dados para os exemplos:
CREATE DATABASE EX_ASSEMBLY GO USE EX_ASSEMBLY GO
O Common Runtime Language, por default, não vem habilitada na instancia, portanto será necessário faze-lo antes de iniciarmos.
EXEC sp_configure 'ADVANCED OPTIONS',1 RECONFIGURE WITH OVERRIDE GO EXEC sp_configure 'clr enabled',1 RECONFIGURE WITH OVERRIDE
Também habilitaremos o CMDShell para que possamos compilar a dll de dentro do SQL (poderia ser realizado pelo prompt de comando)
EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE WITH OVERRIDE
Agora iremos criar uma função em C# bem simples, que irá concatenar uma string passada por parâmetro, a criação poderá ser realizada no notepad e salva com a extensão .cs .
using System; using System.Data; using System.Data.Sql; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class TesteBlogPiroto{ [SqlProcedure] public static void ConcatenandoTexto(String parametro1){ String parametro = string.Concat("Blog do:", parametro1); SqlContext.Pipe.Send(parametro); } };
Após criarmos o arquivo, que no meu exemplo está na raíz do diretório D:\ , nós precisaremos transforma-lo em uma DLL, para isso será necessário utilizar o comando xp_cmdshell, que nos permite executar comandos shell. Para compilar, precisamos do diretório que o nosso .net framework está instalado (no meu caso a versão usada é a 2).
declare @comando varchar(2000) set @comando = 'C:\Windows\Microsoft.NET\Framework\v2.0.30319\csc /target:library /out:d:\BlogPiroto.dll d:\artigo.cs' exec xp_cmdshell @comando
Depois de criarmos a dll será necessário importar seu conteúdo para o SQL Server e para isso iremos utilizar a instrução ‘create assembly’:
Create Assembly exBlogPiroto from 'D:\BlogPiroto.dll' WITH PERMISSION_SET = SAFE
É de extrema importância atentarmos ao permissionamento concedido a um assembly criado, existem três opções:
Safe: O mais restritivo, além de ser a opção default e recomendado pela MS, restringe o acesso do assembly a somente o SQL Server.
UnSafe: Tem acesso irrestrito a todos os recursos da maquina, registro, rede, variaveis do sistema etc.
External_Access: Tem Acesso restrito aos recursos da maquina, pode usar código não gerenciado.
Nao esqueça de ser uma versão suportada pelo SQL, caso contrário o seguinte erro será apresentado
Depois de importar o assembly iremos criar uma procedure que fará referência ao método contido na dll.
CREATE PROCEDURE SP_CHAMAASSEMBLY (@PARAMETRO NVARCHAR(MAX)) AS EXTERNAL NAME EXBLOGPIROTO.TESTEBLOGPIROTO.CONCATENANDOTEXTO
O external name é formado da seguinte forma> [Nome do Assembly].[Nome da Classe].[Nome do Método]
Agora faremos uma chamada a nossa recém criada procedure passando como parametro o texto a ser concatenado.
EXEC SP_CHAMAASSEMBLY ' DHIEGOPIROTO@GMAIL.COM '
Retorno:
Por hoje é isso pessoal!
[]’s