Makale Özeti

SQL Server 2005 ve ASSEMBLY konulu bu makalede, SQL Server 2005 ile gelen en önemli yeniliklerden biri olan Assembly kullanımı kavramına değinelim ve SQL Server ile .NET Framework' ün artık birbirlerine ne kadar yakın katmanlar olduğunu anlamaya çalışalım.

Makale

SQL Server 2005 İçerisinde ASSEMBLY Kullanımı - 1

SQL Server 2005 konulu bu ilk makalede, SQL Server 2005 ile gelen en önemli yeniliklerden biri olan Assembly kullanımı kavramına değinerek, SQL Server ile .NET Framework' ün artık birbirlerine ne kadar yakın katmanlar olduğunu anlamaya çalışacağız.

.NET teknolojilerinin microsoft tarafından duyurulması ile birlikte veritabanı yönetim sistemi olarak SQL Server kullanılması microsoft tarafından oldukça desteklenmiştir. SQL Server veritabanımızda tutulan veriye, en hızlı en kolay yoldan ulaşabilmek adına .NET içerisine System kütüphanesi altında SqlClient sınıfı mevcuttur. Bu sınıf sayesinde .NET kodlarımız içerisinden SQL Server'ımıza rahatlıkla bağlanabiliyor ve her türlü sorguyu çalıştırabiliyoruz. Fakat bu durumda bile halen, veritabanımız, uygulamamız içerisinde ayrı bir katman, .NET kodlarımız ise bununla hızlı bir şekilde haberleşebilen diğer bir katman olarak bulunmakta. Fakat SQL Server 2005 ile birlikte artık bu iki katman birbiri ile o kadar iç içe oldu ki, SQL Server veritabanımız içerisinde .NET kodları yazabilmekte, daha önceden yazdığımız Assembly'leri çalıştırabilmekteyiz. Bu noktada assembly kavramının ne olduğu tanımlayacak olursak; teknolojik olarak dll uzantılı bir bileşen .NET içersinde assembly olarak adlandırılır diyebiliriz. Bir assembly tek bir dll'den oluşabileceği gibi resim ve diğer dosya bileşenlerinin toplamını da ifade edebilir.

Kurulum sırasında SQL Server 2005 ile birlikte gelen .NET Framework 2.0 tarafından yazdığımız .NET kodları derlenmekte ve tamamen veritabanı sunucusu üzerinde kodlar işlenerek SQL Server tarafından bir sonuç üretilmektedir. Teknik altyapıyı irdeleyecek olursak SQL Server 2005 ile birlikte, neden .NET Framework kurulduğunu daha net anlayabiliriz.

.NET Runtime Sunucusu Nedir?
Bir runtime sunucusu, .NET runtime (.NET uygulamalarını çalışmasını sağlayan Framework içerisindeki çekirdek yapı) uygulamasını belleğe yükleyen ve uygulama kodunu derleyerek çalıştıran herhangi bir process'dir şeklinde tanımlanabilir. Bu konuda en sık kullanılan senaryo; windows shell içerisinde bulunan bir programın çalıştırılması ve gerekli dll dosyalarının belleğe yüklenmesi şeklindedir. Bir runtime host , MSCORE.DLL içresinden ICorRuntimeHost yada CorBindToRuntimeEx kullanarak çalışma zamanı uygulamasını belleğe yükler. Bunu yaparken de , server yada workstation bilgisi,CLR (Common Language Runtime) versiyonu, çöp toplayıcı (garbage collector) davranışları ve uygulama alanı (Application Domain) üzerinde anında hata ayıklama (Just-In-Time Debugging) yapısı gibi birtakım parametreleri sisteme iletir.

Çalışma Zamanı sunucusu (Runtime Host) olarak SQL Server
Yukarıda anlatılan yapının dışında, SQL Server tarafından dikkat edilmesi gereken diğer bir nokta da güvenlik ve performans unsurudur. SQL Server tarafından kullanılan yapıyı aşağıdaki grafik ile özetlemek mümkündür.

Yukarıdaki anlatılan yapı ile birlikte artık SQL Server, ASP.NET yada Internet Explorer gibi, yazdığımız kodları derleyen mekanizmaya sahip özelleştirilmiş bir çalışma zamanı sunucusu olarak da hizmet vermektedir.

Bu yapı bize neler kazandırıyor?
En önemli yenilik; artık yazdığımız .NET kodlarımızı uygulama tarafında yazıp SQL Server'a bağlanarak gelen veriye göre işlem yapmak yada veritabanı tarafında standart T-SQL kodları yazmak zorunluluğumuz ortadan kalkıyor. Veritabanı kısmında da .NET kodları yazabiliyor ve bunları derleyerek uygulamalarımız içerisinde kullanabiliyoruz. Kısacası artık sadece .NET sınıflarını kullanarak stored procedure yazmak ve veritabanına kaydetmek mümkün.

Bu kadar teknik altyapı detayından sonra tekrar ana konumuza dönelim ve yazılan .NET Assembly'lerinin SQL Server içerisinden nasıl kullanıldığına bir göz atalım.

.NET Assemlly'leri SQL Server içerisinde saklamak
.NET Assembly'leri CRETAE ASSEMBLY ifadesi ile SQL Server 2005 içerisinde saklanır. Aşağıdaki kod satırı, sadece dll dosyasını veritabanı içerisine tanımlamakla kalmaz ona daha sonra kullanabilmek üzere sembolik bir isim de verir.

CREATE ASSEMBLY SomeTypes
  FROM '\\nw43\types\SomeTypes.dll'

Burda dikkat edilmesi gereken önemli bir ayrıntı da; dll dosya yolunun veritabanı sunucusunun kurulu olduğu makinada bulunma zorunluluğunun olmamasıdır. Yerel ağ içerisinde bulunan herhangi bir makinadaki dosya da veritabanımız içersinde tanımlanabilir. Ayrıca SQL Server birden fazla dosya içeren assembly'lerinde kayıt edilebilmesine izin verir. Aşağıda CREATE ASSEMBLY ifadesi ile ilgili detaylı sözdizimini bulabilirsiniz.

CREATE ASSEMBLY assembly_name [ AUTHORIZATION owner_name ]
  FROM { < client_assembly_specifier > | < assembly_bits >[,...n] }
  [ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]

< client_assembly_specifier > :: =     '\\machine_name\share_name\[path\]manifest_file_name'

< assebly_bits > :: = { varbinary_literal | varbinary_expression }
  • assembly_name : assembly için verilecek isim.
  • client_assembly_specifier : yüklenecek dll için dosya yolu.
  • manifest_file_name : dll ile bağlantılı dosyalar varsa oların yolları da bu kısma yazılır.
  • PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } : .NET kod erişim yetkilerinin ayrlandığı kısım.
  • assebly_bits : assembly'yi oluşturan binary değerlerin listesi.
  • varbinary_literal : yalın haldeki varbinary değer.
  • varbinary_expression : varbinary tipinde bir ifade.

Assembly bilgileri SQL Server 2005 içerisinde 3 adet tabloda saklanır. Bu tabloların adları, içerdikleri kolonlar ve tutulan veri tipleri aşağıda listelenmektedir.

Tablo : sys.assemblies

 Kolon Adı  Veri Tipi  İçerik
 name  sysname assemly'nin adı
 principal_id  int veritabanı şemasında tutlan assembly id değeri
 assembly_id  int unique assembly id değeri
 clr_name  nvarchar(4000) assembly adı, versiyon numarası, public key gibi değerlerin tutulduğu string değeri
 permission_set  tinyint assmbly ile ilgili güvenlik değerlerinin tutulduğu kısım
1 = Sadece güvenli erişim
2 = Harici erişime izin verilsin
3 = Güvenli olmayan bağlantılara da izin verilsin
 permission_set_desc  nvarchar(60) yetki seviye açıklaması
SAFE_ACCESS
EXTERNAL_ACCESS
UNSAFE_ACCESS
 is_visible  bit 1 ise assembly T-SQL içerisinde kullanılabilir, 0 ise kullanılamaz
 create_date  datetime assembly'nin yaratıldığı tarih


Tablo : sys.assembly_references

 Kolon Adı  Veri Tipi  İçerik
 assembly_id  int assembly id değeri
 referenced_assembly_id  int referans assembly için id değeri


Tablo : sys.assembly_files

 Kolon Adı  Veri Tipi  İçerik
 assembly_id  int assembly id değeri
 name  nvarchar(260) assembly adı
 file_id  int dosya id değeri
 content  şmage assembly'nin byte veriler halinde ifadesi


Assembly'lerin yönetimi
Yukarıda anlatılan şekillerde, dll dosyalarımız SQL Server 2005 içerisinde saklandıktan sonra assembly ile ilgili her türlü işlemi SQL veri tanımlama dili (Data Definition Language - DDL) ile yapabiliriz. Assembly'lerin aynen tablolarda olduğu gibi DROP ve ALTER ifadeli kullanılarak silimesi yada içeriklerinin güncelllenmesi mümkündür. Aşağıda DROP ve ALTER ifadelerinin kullanımı ile ilgili örnekleri ve aldığı parametreleri görebilirsiniz.

DROP ASSEMBLY SomeTypes

DROP ASSEMBLY assembly_name [ WITH drop_option [,...] ]

drop option ::= CASCADE | DEPENDENT_ASSEMBLIES


Yukarıda gördüğümüz gibi eğer assembly'ye bağlı başka assembly'ler de sistemde kayıtlıysa assembly silinirken drop option'a bir seçenek değeri atanarak ilişkili assembly'lerin de silinip silinmeyeceği SQL Server'a bildirilir.

ALTER ASSEMBLY SomeTypes
  VISIBILITY=OFF

Yukaridaki ALTER ifadesi ile kaydedilen assembly'nin herhangi bir özelliği değiştirilebilir. Burada Visibility özelliği on olan SomeTypes adlı assembly artık T-SQL cümlelerinin içinde kulalnılmak istenmiyor ve bunun içinde assembly'nin görünürlük özelliği iptal edilmiş durumda.

ALTER ASSEMBLY SomeTypes
  FROM '\\nw43\types\SomeTypes.dll'


Bu ifade ile de assembly'nin tekrar SQL Server içerisine yüklenmesi sağlanabilir. ALTER ASSEMBLY ile ilgili tüm parametrelere aşağıdan ulaşabilirsiniz.

ALTER ASSEMBLY assembly_name
  [ FROM { < client_assembly_specifier > | < assembly_bits > [,...n] } ]
  [ WITH < assembly_option > [,...n] ]
  [ DROP FILE ( file_name [,...n] |ALL ) ]
  [ ADD FILE FROM ( client_file_specifier [ AS file_name | file_bits AS file_name [,...n]] ) ]

< client_assembly_specifier > ::= '\\computer_name\share-name\[path\]manifest_file_name'

< assembly_bits  > ::= ( varbinary_literal | varbinary_expression )

< assembly_option > ::= [ PERMISSION_SET { SAFE | EXTERNAL_ACCESS |UNSAFE } ]
   [ VISIBILITY { ON | OFF } ]
     UNCHECKED DATA


Sonuç
Buraya kadar SQL Server 2005 ile birlikte gelen assembly kavramının ne olduğunu ve SQL Server içerisinde nasıl ele alınıp depolandığını anlamaya çalıştık. Bir sonraki makalede ise dll dosyamız içerisinde bulunan .NET fonksiyonlarımızın  CREATE ASSEMBLY ifadesi ile SQL Server'a kaydedildikten sonra, T-SQL içerisinde nasıl çağrılıp kullanılacağına değineceğiz.

Az hatalı günler dileğiyle...