SQL Server 2005 - Integração com .NET CLR – Parte I


Atualmente uma das melhores tecnologias para desenvolvimento de sistemas é o .Net da Microsoft. Esta é a bola da vez na área de desenvolvimento. Como parte da filosofia da Microsoft de integrar todas as suas ferramentas, ela implementou no SQL Server 2005 a  integração com a CLR do Framework 2.0, permitindo assim aos desenvolvedores, utilizarem a orientação à objeto na criação de Stored Procedures, User Defined Functions(UDF) , Triggers e User Defined Types(UDT), podendo utilizar a linguagem que for mais conveniente.

 

Para criar objetos .NET no database, primeiro devemos escrever o código gerenciado e compilá-lo em um Assembly .NET. Neste artigo, estaremos escrevendo um código em C# bem simples, pois o intuito no momento é apenas de mostrarmos as nuances do comando CREATE ASSEMBLY para o registro dos assemblies, e nos próximos artigos entraremos a fundo em todas as opções para criação dos objetos em .NET.

 

using System;
using System.Data;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
 
namespace Integracao {

  public class MinhasStoredProcedures
  {
    public static void sp_Teste()
    {
      SqlContext.Pipe.Send("Minha Primeira Stored Procedure .NET");
    }
  }
}

Listagem 1. Pequeno programa em C#, que deve ser colocado em uma Class Library para o nosso teste.

 

A integração com CLR está desligada por default no SQL Server 2005, devemos habilitá-la para conseguirmos utilizar nosso assembly (Listagem 2).

sp_configure 'clr enabled', 1;

go

RECONFIGURE
Listagem 2. Comandos para habilitar a execução de código gerenciado no SQL Server.

Agora estamos prontos para a utilização da integração com a .NET CLR. O primeiro passo é registrar o nosso assembly no SQL Server 2005. Abaixo temos a sintaxe base do comando CREATE ASSEMBLY.

 

CREATE ASSEMBLY assembly_name

[ AUTHORIZATION owner_name ]

FROM { | [ ,...n ] }

[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]

 

Abaixo temos uma descrição dos argumentos deste comando:

 

·          : Nome do assembly , deve ser único no database e um identificador válido no SQL Server 2005.

·          [ AUTHORIZATION owner_name ] : Especifica o user ou role que será o proprietário do assembly.

·          FROM { | [ ,...n ] } : Caminho físico onde se encontra o assembly.

·          [ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ] : Opções de segurança para a execução do assembly. Onde:

·          SAFE: Está é a recomendação da Microsoft , SAFE é a opção mais restritiva. Código executado por um assembly com SAFE não tem permissões para acessar recursos externos como arquivos , rede ou registry. Está é a opção default caso outro não seja indicada.

·          EXTERNAL_ACCESS : Habilita o assembly a acessar certos recursos externos como  arquivos , rede ou registry.

·          UNSAFE: Opção menos restritiva, tem acesso irrestrito a recursos externos, dentro e fora da instancia do SQL Server, podendo até chamar código não gerenciado.

 

O código T-SQL na Listagem 3 serve para registrar a dll que construímos com o código da Listagem 1.

 

CREATE ASSEMBLY IntegracaoCLR

from 'D:\TestesC#\Diversos\IntegracaoSQL2005\IntegracaoSQL2005.dll'

Listagem 3. Registra o assembly.

 

Select * from sys.assemblies

Listagem 4. Verifica os assemblies registrados.

 

Agora que temos nosso assembly registrado podemos utilizá-lo em uma stored procedure (Listagem 5).

 

CREATE PROCEDURE SP_TESTE

as EXTERNAL NAME IntegracaoCLR.[Integracao.MinhasStoredProcedures].sp_Teste

 

go

 

exec SP_TESTE

Listagem 5. Criação e execução da stored procedure.

 

A única diferença para a criação de stored procedures comuns é a utilização do argumento EXTERNAL NAME que deve conter as seguintes partes:  Nome do Assembly.[namespace.classe].método.

 

A execução de nossa stored procedure simplismente nos mostra um print como resultado.

 

Algumas outras considerações sobre o registro de assemblies:

 

·          Todos os assemblies que sejam refenciados pelo assembly que está sendo registrado também serão incluídos.

·          Somente usuários com permissões de sysadmin podem registrar assemblies com a opção UNSAFE.

·          Para excluírmos um assembly devemos primeiro excluir todos os objetos que o refenciam. Para verificarmos quais são os objetos que utilizam um assembly usamos o seguinte select da Listagem 6.

 

select c.name from  sys.assemblies a inner join  sys.module_assembly_usages b  on a.assembly_id = b.assembly_id  inner join sys.all_objects c on b.object_id = c.object_id where a.name = 'IntegracaoCLR'

Listagem 6. Vericar quais são os objetos dependentes de um assembly.

 

·          O SQL Server utilize case sensitive para a o registro do assembly portanto sp_Teste é diferente de sp_teste.

·          Após o registro do assembly o arquivo físico não é mais necessário, pois o SQL Server mantém uma cópia.

 

Para a exclusão de um assembly utilizamos o comando da Listagem 7.

 

DROP ASSEMBLY IntegracaoCLR

Listagem 7. Excluir um assembly

 

Conclusões

Podemos ver neste breve artigo que a integração do CLR com o SQL Server é extremamente fácil, e será de grande utilizadade para os nossos próximos desenvolvimentos. Por hora é isso , no próximo artigo estaremos abordando por completo as opções para a criação de stored procedures em .NET.

 

Um abraço ,

Eugênio Spolti