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
Para criar objetos .NET no database, primeiro devemos escrever o código gerenciado e compilá-lo
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
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
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 {
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
Abaixo temos uma descrição dos argumentos deste comando:
·
·[ AUTHORIZATION owner_name ] : Especifica o user ou role que será o proprietário do assembly.
·FROM {
·[ 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