Makale Özeti

SQL Server 2005in .NET Programcıları tarafından en önemli ve çekici özelliği olan Assembly host edebilme özelliğini inceleyeceğiz.

Makale

.NET ile SQL Server 2005 Programlama - 1

 

Giriş

SQL Server 2005 Beta1 ile hazırlanan 3 seriden oluşan makalede SQL Server 2005in .NET Programcıları tarafından en önemli ve çekici özelliği olan Assembly host edebilme özelliğini inceleyeceğiz.

 

SQL Server 2005’in getirdiği en önemli özellik olarak söyleyebileceğimiz özelliği .NET ile birlikte çalışabilmesidir. Bu durum özellikle şuan .NET ile uygulama geliştiren yazılım geliştiricileri heyecanlandırmaktadır.

 

SQL Server 2005, .NET ile yazılmış dll dosyalarını kendi çalıştırma ortamı içerisinde çalıştırabilmekte yani “host” edebilmektedir.

 

.NET ile SQL Server 2005 için “Managed” (yönetilen) diye tanımlanan nesneler oluşturabiliriz. Bu nesnelere “Managed” denilmesinin sebebi .NET ile geliştirilen uygulamanın .NET çalışma ortamını sağlayan Common Language Runtime (CLR) tarafında yönetilmesidir. Aynı şekilde SQL Server üzerinde çalışan bir .NET Assembly’si de “Managed” yani yönetilen ortamda çalışır.

 

SQL Server 2005 .NET Assembly’lerini host edebilmesi sayesinde oluşturulabilen veritabanı nesneleri nelerdir?

 

·         Stored Procedure

·         Function

·         Trigger

·         Aggregate Function

·         Kullanıcı Tanımlı Özel Veri Türleri

 

SQL Server 2000 ile ADO.NET kullanarak uygulama geliştirirken SqlClient Veri Sağlayıcısını (Data Provider)  kullanıyorduk. Bu durum hala geçerli fakat SQL Server üzerinden çalışacak olan .NET kodlarında kullanılması amacıyla System.Data.SqlServer namespace hiyerarşisinde yer alan yeni bir veri sağlayıcısı .NET 2.0 ile beraber SQL Server 2005 için gelmektedir. Bu veri sağlayıcısının adı “In-Proc Managed Provider” olarak geçer. In-Proc “In Process” kelimelerinden oluşturulmuş bir kısaltmadır.

 

In-Proc Veri Sağlayıcısında yer alan sınıflardan ve kullanımlarından bahsetmeden önce .NET ile yazılmış metodların nasıl SQL Server 2005 ile çalışabilir hale geleceğini inceleyeceğiz. Ardından In-Proc veri sağlayıcısını örnekler ile inceleyeceğiz.

Assembly Yönetimi

SQL Server 2005’in gerek duyduğu kurallar çerçevesinde tasarlanmış olan sınıflar ve metodları içeren bir assembly dosyası elde edildiğinde bunun SQL Server üzerinde çalıştırılabilmesi için SQL Server tarafından kataloglanması gerekir. Kısacası assembly dosyasının SQL Server’a tanıtılması gerekir.

 

Bir assembly’nin SQL Server’a tanıtılması için CREATE ASSEMBLY ifadesi kullanılır.

 

CREATE ASSEMBLY

FROM

 

Burada CREATE ASSEMBLY deyiminden sonra assembly’nin SQL Server üzerindeki mantıksal ismi tanımlanır. FROM anahtar kelimesinden sonra ise DLL dosyasının bulunduğu fiziksel konum belirtlir. Örneğin;

 

CREATE ASSEMBLY BilgeAdam

FROM ‘C:\cengiz\BilgeAdam.dll’

 

Yukarıdaki örnekte C:\cengiz\BilgeAdam.dll konumundaki assembly dosyası SQL Server’a BilgeAdam ismi ile kayıt edilmiştir.

 

Kaydedilen dll dosyaları veritabanında bir sistem tablosunda saklanmaktadır. Bir dll dosyasını CREATE ASSEMBLY ile SQL Server’a kaydettikten sonra SQL Server’ın sürücüdeki fiziksel dosya ile hiç bir bağlantısı kalmaz. Dosyanın kopyası veritabanında saklanır. Bu şekilde backup ve restore gibi işlemlerde assembly dosyalarıda saklanmış olurlar.

 

Bu komut çalıştığında SQL Server sadece bu dll dosyasını değil bu assembly’nin ihtiyaç duyduğu (refere ettiği) diğer assembly dosyalarınıda veritabanındaki sistem tablosunda saklar. Burada refere edilen diğer assembly dosyaları .NET Framework assembly dosyaları değil, kullanıcı tanımlı assembly dosyalarıdır. SQL Server .NET Framework’ün assembly dosyalarını kaydetmesine gerek olmadığı için o assembly dosyalarını kaydetmez. Ayrıca refere edilen diğer assembly dosyasının SQL Server tarafından kaydedilebilmesi için ana dosya ile aynı klasörde olması gerekir.

 

CREATE ASSEMBLY ifadesi ile bir assembly dosyası veritabanına kaydedilir. Kaydedilen assembly tüm sunucu bazında değil veritabanı bazında kaydedilir. Ve assembly için verilen mantıksal ismin veritabanı üzerinde tekil olması gerekir.

 

NOT: Veritabanında kayıtlı olan assemblyler hakkında bilgi almak için sys.assemblies view nesnesini sorgulayabilirsiniz. Ayrıca sys.assembly_files view nesnesi ile her bir assembly için veritabanına eklenmiş olan dosya(lar) görüntülenebilir.

 

SELECT * FROM sys.assemblies

SELECT * FROM sys.assembly_files

 

Code Access Security (CAS)

 

Bir assembly veritabanına yüklendiğinde assemblynin yapabileceği yada yapamıyacağı işler belirlenmelidir. Bazı kaynaklara erişim veya işlemleri yapabilme izni belirlemek gerekir. CLR altında çalışan .net assemblyleri güvenlik ayarlamaları Code Access Security (CAS) ile yapılır.

 

SQL Server 2005 assemblyler için üç tane güvenlik modeline sahiptir. Bunlar SAFE, EXTERNAL ACCESS, UNSAFE.

 

CAS Modeli

Açıklama

 

SAFE

Veriye erişim yetkisi vardır. In-Proc veri sağlayıcısı sınıflarını kullanabilir. Dosya sistemi, ağ bağlantısı gibi dış kaynaklara erişim yetkisi yoktur. Varsayılan güvenlik modelidir.

 

EXTERNAL_ACCESS

SAFE ile yapılan bilen tüm işlemlerin yapılabileceği gibi dosya sistemi, ağ bağlantısı, event loglar gibi dış kaynaklara erişim de sağlanabilir.

 

UNSAFE

Bu güvenlik modeli ile çalışan kodlar üzerinde CASın hiç bir kısıtlaması yoktur.

 

 

CREATE ASSEMBLY BilgeAdam

FROM ‘C:\cengiz\BilgeAdam.dll’

WITH PERMISSION_SET=SAFE

 

CREATE ASSEMBLY BilgeAdam

FROM ‘C:\cengiz\BilgeAdam.dll’

WITH PERMISSION_SET=EXTERNAL_ACCESS

 

CREATE ASSEMBLY BilgeAdam

FROM ‘C:\cengiz\BilgeAdam.dll’

WITH PERMISSION_SET=UNSAFE

 

 

CREATE ASSEMBLY ifadesi kullanılırken WITH PERMISSION_SET eki kullanılmaz ise assembly kaydı varsayılan olarak belirlenmiş olan SAFE güvenlik modeli ile yapıllır.

 

 

Kaydedilen Bir Assembly’nin SQL Server Veritabanından Silinmesi

 

Kaydedilen bir assemblynin veritabanından silinmesi için DROP ASSEMBLY ifadesi kullanılır.

 

DROP ASSEMBLY

Örneğin BilgeAdam ismi ile kaydettiğimiz assembly’i silmek için aşağıdaki komut çalıştırılmalıdır.

 

DROP ASSEMBLY BilgeAdam

 

DROP ASSEMBLY komutu yukarıdaki şekilde kullanıldığında assembly’i silebilmesi için assembly’i kullanan bir veritabanı nesnesi (stored procedure,function gibi) olmamalıdır. Assembly silinmeden önce onunla ilgili veritabanı nesneleri önceden silinmelidir.


 

İlgili makaleler :
.NET ile SQL Server 2005 Programlama - 1
.NET ile SQL Server 2005 Programlama - 2
.NET ile SQL Server 2005 Programlama - 3



Cengiz HAN

Microsoft ASP.NET MVP

cengiz.han@yazgelistir.com

www.cengizhan.com