Makale Özeti

Microsoftun yeni ürünleri, Longhorn, Whidbey ve Yukon ile ilgili çıkan haber sayısı sürekli artıyor ve artık bu konularda makaleler yayınlamanın zamanıda geldi diye düşünüyorum..Sql Serverın yeni sürümü: Yukon. Bu makale iki bölümden oluşuyor olacak. İlk bölümde SQL Serverın CLR ile bütünleşmesini, ikinci bölümde ise .NET Rutinlerini ele alıyor olacağız.

Makale

Bu makale Microsoft SQL Server Yukon Beta 1 göz önüne alınarak yazılmıştır. Bu makalede yer alan bilgiler ileride yayınlanacak betalarda ve ürün yayınlandığında değişiklik gösterebilir ve/veya mevcut olmayabilir. Bu makale sadece fikir verme amacıyla yazılmıştır.

Microsoftun yeni ürünleri, Longhorn, Whidbey ve Yukon ile ilgili çıkan haber sayısı sürekli artıyor ve artık bu konularda makaleler yayınlamanın zamanıda geldi diye düşünüyorum.. Ancak bu makalede ve bu ürünler beta aşamasındayken yayınlanan makalelerde verilen bilgilerin (bahsedilen özelliklerin) ileride değişikliğe uğrayabileceğini ve/veya ürün yayınlandığında geçerli olmayabileceğini hatırlatmak istiyorum.

Ele alacağımız ilk ürün, Sql Serverın yeni sürümü: Yukon. Bu makale iki bölümden oluşuyor olacak. İlk bölümde SQL Serverın CLR ile bütünleşmesini, ikinci bölümde ise .NET Rutinlerini ele alıyor olacağız.

SQL Server Yukon ve CLR Entegrasyonu
Yukon ile birlikte Common Language Runtime ile veritabanının bütünleştirilmesinden söz ediyor olacağız. Uygulama geliştiriciler Yukon ile birlikte stored procedure leri, trigger ları ve kullanıcı tanımlı fonksiyonları Visual Basic.NET ve/veya Visual C#.NET ile geliştirebiliyor olacaklar.  Ek olarak iki yeni nesne, kullanıcı tanımlı fonksiyonlar ve aggregate lar managed kod ile geliştirilebiliyor olacak.

SQL Server ve .NET arasındaki bu entegrasyon, veritabanı ve uygulama geliştiricilere pek çok önemli fayda sağlayacaktır.

  • Geliştirilmiş programlama modeli: .NET dilleri çoğu durumda Transact-SQLe göre çok daha zenginler ve SQL geliştiricileri için önceden varolmayan yapı ve özellikler sunarlar.
  • Geliştirilmiş güvenlik: Managed kod veritabanı motoru tarafından sağlanan bir common language runtime ortamında çalışır ve bu .NET veritabanı nesnelerinin SQL Serverın önceki sürümlerinde varolan genişletilmiş stored procedure lardan daha güvenlidir.
  • Kullanıcı tanımlı türler ve aggregate lar: (aggregation: com tarafından sunulan interface inheritance yöntemlerinden biri.) Kullanıcı tanımlı türler ve aggregate lar, SQL Serverın depolama (storage) ve sorgulama yeteneklerini genişleten iki yeni managed veritabanı nesnesidir.
  • Genel Geliştirme Ortamı: Veritabanı geliştirme süreci, Visual Studio.NETin gelecekteki sürümlerinde uygulama geliştirme süreci ile bütünleştirilmektedir. Uygulama geliştiriciler veritabanı nesnelerini ve scriptlerini geliştirmek ve yönetmek için middle-tier veya client-tier .NET bileşenlerini ve servislerini geliştirirken kkullandıkları gibi, aynı araçları kullanacaklardır.
  • Performans ve esneklik: Çoğu durumda, .NET dil derleme ve çalıştırma modelleri Transact-SQLe göre daha yüksek performans sağlamaktadır.

CLR Entegrasyonu
SQL Server Yukon ile sunulan CLR ortamı sayesinde stored procedureler, triggerlar, kullanıcı tanımlı fonksiyonlar ve diğer veritabanı nesnelerini managed kod ile oluşturabilirdiniz. Managed kod, çalıştırılma öncesinde native koda dönüştüğü için bazı senaryolarda çok büyük performans kazancı sağlayabilirsiniz. Managed kod, assemblie ların bazı işlemleri yapmasını önlemek için Code Access Security (CAS) kullanır. SQL Server Yukon, managed kodun güvenliğini sağlamak için CAS kullanır ve işletim sistemi ve veritabanı sunucusunun güvenliğinin sağlanmasına yardımcı olur.

Managed Kod
CLR, Microsoft .NET Frameworkun temelidir ve tüm .NET kodları için çalıştırılma ortamı sağlar. Bu nedenle CLR aracılığıyla çalıştırılan kod "managed kod" olarak tanımlanır.  CLR, bir uygulamanın çalışması için JIT (just in time) compilation, bellek tahsis ve yönetimi, tür güvenliği, exception yönetimi, thread yönetim ve güvenliği gibi pek çok fonksiyon ve servis sağlar. SQL Server Yukon, bir .NET rutininin ilk çağrılışında CLRı yükler.

Transact SQLin Kısıtlamaları
Transact-SQL, ISO (international standarts organization) ve american national standarts institute (ansi) tarafından tanımlanmış kurallar doğrultusunda geliştirilmiş Structed query language uzantısıdır. Uygulama geliştiriciler Transact-Sql dilini kullanarak veritabanları, tablolar oluşturabilir, düzenleyebilir, silebilir ve kayıt ekleyebilir, düzenleyebilir, silebilir görüntüleyebilirler. Transact-Sql doğrudan veri erişimi ve yönetimi işlemlerine spesifik bir dildir. Her ne kadar Transact-Sql veriye erişim ve yönetimi konusunda çok yetenekli ve yeterli bir dil olsa da, Visual C#.NET veya Visual Basic.NET gibi tam anlamıyla bir programlama dili değildir. Örneğin Transact-Sql dizileri, koleksiyonları, foe each döngülerini veya sınıfları desteklemiyor. Bu yapıların bazıları Tansact-Sqlde simule edilebiliyor olsada, managed kod, bu yapılarına (ve saymadıklarımıza) doğal bir destek sağladığından pek çok işlem daha kolay ve hızlı gerçekleştirilebiliyor.  Senaryoya bağlı olarak, bu özellikler bazı veritabanı işlemlerinin managed kod ile gerçekleştirilmesi için tartışılmaz gerekçeler çıkartabiliyor karşımıza.

CLR Entegrasyonunun Sağladığı Avantajlar
SQL Serverın önceki sürümlerinde uygulama geliştiriciler ve veritabanı programcıları sunucu tarafında uygulama geliştirirken Transact-Sql ve yetenekleri ile sınırlıydı. CLR entegrasyonu ile, veritabanı geliştiricileri sadece Transact-Sql kullanılarak geliştirilmesi imkansız veya çok zor işlemleri managed kod ile kolayca gerçekleştirebiliyor olacaklar. Geliştiriciler CLR entegrasyonu sayesinde çok daha gelişmiş ve fonksiyonel kodları, Visual C#.NET ve Visual Basic.NET dillerini kullanarak geliştirebiliyor olacaklar.

Visual Basic .NET ve C# encapsulation, inheritance ve polymorphism gibi nesneye yönelik yeteneklere sahiptirler. İlgili kod artık çok daha kolay bir şekilde sınıf ve namespaceler arasında organize edilebilir. Bu çok büyük miktarda sunucu kodu ile çalışırken, kodları çok daha kolay organize etmenizi ve verimli kullanabilmenizi sağlayacaktır.  Kodların assemblie lar ve namespace ler ile mantıksal ve/veya fiziksel olarak organize edilebilmesi çok büyük avantajlar sağlamaktadır ve size büyük veritabanı implementasyonlarında farklı kod parçalarını daha kolay bulma ve ilişiklendirme avantajı sağlayacaktır.

Managed kod, komplike mantık yürütme gibi işlemler için çok daha uygundur ve string handling ve regular expressions gibi pek çok kompleks işlem için genişletilmiş destek sağlayan özelliklere sahiptir. .NET Framework Base Class Librarynin (BCL) sağladığı fonksiyonellik sayesinde uygulama geliştiriciler artık yüzlerce önceden hazırlanmış sınıflara ve rutinleri kullanabilecek. BCL gelişmiş string işlemleri, gelişmiş matematiksel işlemler, dosya işlemleri, şifreleme ve daha pek çok işlem için destek sağlayan sınıfları içermektedir. Bu sınıfların pek çoğunun kullanımı SQL CLR kodu ile mümkün iken, sunucu tarafında kullanımı uygun olmayanlar mevcut değildir.

Managed kodun bir diğer faydası ise type safety. Managed kod execute edilmeden önce kodun güvenliği CLR tarafından denetlenir. Bu işlem "verification" olarak bilinmektedir. Verification esnasında CLR pek çok denetim gerçekleştirerek kodun çalıştırılmak için güvenli olduğundan emin olur. CLR aynı zamanda buffer overflow sorununuda önlemektedir.

Varsayılan olarak hem Visual Basic.NET hem de C# güvenli kod üretirler. Aynı zamanda C# programcıları güvenli olmayan kod üretmek (örneğin belleğe doğrudan erişim) için güvenli olmayan anahtar kelimeleri kullanma imkanına sahiptirler.

Transact-SQL - Managed Kod. Ne zaman, hangisini seçmeli?
Stored procedureleri, triggerları ve kullanıcı tanımlı fonksiyonları geliştirirken uygulama geliştiricilerin Transact-Sql veya Managed kod yani C# veya VB.NET arasında bir tercih yapma imkanları vardır. Bu tercih mevcut koşullara göre yapılacaktır. Managed kodun, yoğun işlemci (cpu) gücü gerektiren koşullarda, kompleks mantıksal özellikler içeren fonksiyonlarda ve .NET Framework Base Class Librarye erişmek istediğiniz durumlarda tercih edilmesi daha doğrudur.

Kodun çalıştığı yer de oldukça önemlidir. Hem Transact-Sql hem de managed kod sunucu üzerinde çalışabilir. Bu, kod ve veriyi bir arada tutar ve sunucunun gücünden faydalanmanıza olanak tanır. Diğer tarafta, yoğun işlemci gücü gerektiren görevleri veritabanı sunucunuzda tutmak isteyebilirsiniz. Günümüzde istemci bilgisayarlar oldukça güçlü hale geldi ve bu işlemci gücünden faydalanmak için istemci tarafında mümkün olduğunca kod çalıştırmakta isteyebilirsiniz. Transact-Sql bir istemci makinada çalışamıyor iken, Sql Server in-process provider, kodunn taşınabilirliğini sağlayan client-side managed ADO.NETe benzer bir şekilde tasarlanmıştır. in-process provider makalenin ilerleyen bölümlerinde ele alınacaktır.

Assemblielar ile Çalışmak
Managed kod yazarken, deployment ünitesi assembly olarak tanımlanır. Bir assembly, dll veya executable (exe) gibi bir paketlenmiş dosyadır. Bir executable kendi başına çalışabiliyorken, bir dll dosyası mevcut bir diğer uygulama tarafından host edilmelidir. Managed dll assemblieları SQL Server Yukon tarafından host edilebilir ve kullanılabilirler.

Assemblieların kullanımı
CREATE ASSEMBLY ifadesi sunucu tarafında bir assembly register etmek için kullanılır. Aşağıdaki örneği inceleyelim:

CREATE ASSEMBLY YazgelistirDeneme
FROM
C:\Yazgelistir\YazgelistirDeneme.dll

FROM ifadesi yüklenecek assemblyın adresini belirtmektedir. Bu adres bir UNC adres veya sunucu üzerindeki bir fiziksel dosya olabilir.

Bir assemblyın un-register edilmesi için aşağıdaki sözdizimi ile DROP ASSEMBLY ifadesini kullanırız:

DROP ASSEMBLY YazgelistirDeneme

Microsoft SQL Server Yukon Beta 1de bir assemblyın yüklenmesi, assembly tarafından sunulan fonksiyonelliğin sunulması yolundaki ilk adımdır.

Permission Set ve Loaded Assemblieların Kavranması
Bir assemblyın güvenliği, onu çalıştıran kullanıcının kimliği ile ilgilidir, kodun kendi kimliği ile değil. Güven, bir veritabanı kullanıcı veya rolüne bağlı olarak sağlanır. Veri ve kod, farklı kullanıcılara veya rollere ait veri ve kodlardan izole edilmiş belirli bir kullanıcıya veya role aittir.

Veritabanı kullanıcılarına veya kullanıcı rollerine, bir veritabanında kendi assemblylarını oluşturma yetkisi verilmiştir. Bir assemblyın sahibi, sahibi olduğu assemblyın farklı veritabanı kullanıcıları veya kullanıcı rolleri tarafından refere edilmesine izin verebilir. Bir assembly, diğer assemblyları refere ederken/çağırıken sadece, çağırdığı/refere ettiği assembly ile aynı kullanıcı veya role aitse veya çağırdığı/refere ettiği assemblyın sahibi tarafından bu işlem için yetkilendirilmişse ve çağırılan/refere edilen assembly ile aynı veritabanındaysa başarılı olur.

Bir assembly SQL Servera yüklenirdek, üç farklı güvenlik seviyesini kullanma imkanınız vardır.

SAFE
EXTERNAL_ACCESS
UNSAFE


SAFE, varsayılan izin seviyesidir ve çoğu temel senaryo için kullanılabilirdir. Bir güvenlik seviyesi belirtmek için CREATE ASSEMBLY ifadesini aşağıdaki gibi değiştirmelisiniz:

CREATE ASSEMBLY YazgelistirDeneme
FROM
C:\Yazgelistir\YazgelistirDeneme.dll
WITH PERMISSION_SET = SAFE

Bir assemblyı SAFE güvenlik seviyesi ile yukarıdaki koddaki üçüncü satırı yazmadanda register edebiliriz. (SAFE,in varsayılan güvenlik seviyesi olduğunu hatırlayalım)

CREATE ASSEMBLY YazgelistirDeneme
FROM
C:\Yazgelistir\YazgelistirDeneme.dll

Assembly içindeki kod SAFE güvenlik seviyesi ile çalışırken sadece in-process managed provider aracılığıyla sunucu üzerinde işlem yapabilir ve veriye erişebilir.

EXTERNAL_ACCESS assemblyın sunucu dışındaki kaynaklara örneğin dosyalara, networke, registrye ve ortam değişkenlerine erişme ihtiyacı olması durumunda kullanabileceğimiz güvenlik seviyesidir. Sunucu harici bir kaynağa eriştiğinde managed kodu çağıran kullanıcının güvenlik bilgilerini canlandırır.

Bir EXTERNAL ACCESS assembly oluşturmak için geliştiricinin EXTERNAL ACCESS izni olmalıdır. EXTERNAL_ACCESS yetkisi ile çalışacak bir assembly oluşturmak için assemblyı yüklerken sadece yetki seviyesini değiştirmemiz yeterlidir:

CREATE ASSEMBLY YazgelistirDeneme
FROM
C:\Yazgelistir\YazgelistirDeneme.dll
WITH PERMISSION_SET = EXTERNAL_ACCESS

UNSAFE yetki seviyesi ise assemblyın güvenilirliği doğrulanamayan veya erişimin sınırlandırıldığı kaynaklara (Win32 API gibi) erişimin gerekmesi durumunda kullanılabilir. 

Bir UNSAFE assembly oluşturmak için yetki seviyesi olarak UNSAFE belirtmemiz gerekir.

CREATE ASSEMBLY YazgelistirDeneme
FROM
C:\Yazgelistir\YazgelistirDeneme.dll
WITH PERMISSION_SET =
UNSAFE

Yetki seviyeleri ve açıklamaları için aşağıdaki tabloyu inceleyebilirsiniz:

Yetki Seviyesi Açıklama
SAFE Çok kısıtlı yetki.
Harici erişim yetkisi yoktur.
EXTERNAL_ACCESS SAFE yetki seviyesine ek olarak dosyaları ve klasörleri okuma, yazma yetkisi, networke, olay günlüğüne ve registrye erişme yetkisi vardır.
UNSAFE Assemblyların type-safe olduğuna dair güvence yoktur.
Unmanaged kod tarafından çalıştırılabilirler.

SAFE yetki seviyesi çoğu durum için yeterli ve önerilen yetki seviyesidir.

Diğer Assemblyların Refere Edilmesi
Assemblylar diğer assemblyları refere edebilir. Bu, çalıştırdığınız bir assembly aracılığıyla, ihtiyaç duyduğunuz fonksiyonları size sağlayacak bir veya daha fazla assemblyı kullanabileceğiniz anlamına geliyor.


Bu makalede SQL Serverın yeni sürümü Yukonun 1. Betasını göz önüne alarak bizi bekleyen yeni özellikler hakkında fikir vermeye çalıştık. Yukon hakkındaki bir sonraki makalede .NET Rutinleri konusunu ele almaya başlayacağız.

Kadir Sümerkent
kadirs@yazgelistir.com