17 Ocak 2017 Salı

Trigger’lar Ne Zaman Kullanılmalıdır?



Trigger’lar aşağıdaki amaçlara yönelik kullanılırlar.
Değişiklikleri takip etmek için: Kritik kayıtlar üzerinde değişiklik yapan kişiler ve değişiklik miktarlarını ya da kayıtlarının takibini tutmak için kullanılırlar.
Birincil anahtar üretmek için: IDENTITY( ) fonksiyonu birincil anahtar olarak sadece sayı üretebilmektedir. Bazı durumlarda birincil anahtarın belli harf ve rakamlardan oluşması gerekebilir. Böyle durumlarda yine trigger’lara başvurulabilmektedir.

Trigger’lar aşağıdaki amaçlara yönelik kullanılırlar.
Karmaşık iş kurallarını gerçeklemek için: Bazen uygulama veritabanının dışında bir veritabanına karşı, yabancı anahtar geçerliliğini denetlemek gerekebilmektedir. Bu durumda sadece veritabanı içindeki işler denetlenebilmektedir. Fakat trigger’ lar ile diğer veritabanları da denetlenebilmektedir.
Mail atmak gibi işleri otomatikleştirmek için: Örneğin herhangi bir sipariş verildiğinde müşteriye bilgilendirme mail göndermek için kullanılabilmektedir.

Bunların dışında;
Standart hata mesajlarının dışında hata mesajı vermek için
Veritabanı erişimlerini takibe almak için
Yeni nesne oluşturma işlemlerini, sunucu veritabanlarının tutarlılıklarını sağlamak için
Nesne değişikliklerini takip etmek ve engellemek için
    kullanılabilmektedirler.

Trigger’lar


Trigger yani tetikleyici, ilişkisel veritabanı yönetim sistemlerinde bir tabloda belirli olaylar meydana geldiği zaman yani ekleme, güncelleme, silme işlemlerinden biri gerçekleşmeden önce veya sonra çalışan ve belirli işlemleri kodlandığı şekilde yerine getiren yordamdır.
Tetikler veritabanında yapılan değişikliklerle birlikte otomatik olarak çalışan prosedürel program parçacıklarıdır.


Trigger’lar, veri değişiminin hemen ardından log dosyalar üzerinden otomatik olarak devreye giren özel bir Stored Procedure’dür.
Genellikle karmaşık iş kurallarını gerçekleştirmek için veya basamaklı veri bütünlüğünü programlamak için kullanılırlar.

SQL Server ve Transaction



SQL Transaction’ları da diğer işlemlerden farksız olarak atomik bir yapıya sahiptir.
Herhangi bir SQL sorgusu da aynı yapıda olduğu için ya tüm komut/sorgu başarıyla çalıştırılır ve sonucu alınır ya da veri tabanında hiçbir değişiklik yapılmadan işlem sonuçlandırılır. Dolayısı ile bunları Transaction yapıları içinde kullanmak mümkündür.
SQL Server’ da transaction’ın genel yapısı aşağıdaki gibidir.

    BEGIN TRANSACTION
    Transaction komutları
    COMMIT TRANSACTION / ROLLBACK


Aşağıdaki niteliklere sahip banka hesaplarının tutulduğu bir tablo oluşturalım.

Oluşturduğumuz bu tabloya iki adet kayıt ekleyelim. Dilerseniz daha fazla kayıtta ekleyebilirsiniz.

Oluşturduğumuz bu tablo üzerinde bir Stored Procedure (SP) tanımlayalım.

Bu SP dışarıdan havale yapanın hesap numarasını, havaleyi alacak olan kişinin hesap numarasını ve havale miktarını alacak ve Transaction başladıktan sonra havale işlemini gerçekleştirecektir.
Eğer havalede bir sorun çıkmaz ise işlem geçerli olacaktır. Bir sorun oluşur ise, her aşamada «ROLLBACK» komutu ile bütün işlemler geri alacaktır.

Oluşturduğumuz «havale» procedure’ü aşağıdaki gibidir.



SP’yi bir havale işlemi gerçekleştirerek test ederek sonuçlarına baktığımızda havale işleminin sorunsuz gerçekleştiği görülmektedir. 



 Bu transaction bloğu çalıştırıldığında hesap numaralarının herhangi birinin yanlış girilmesi durumunda dikkat edilirse herhangi bir uyarının verilmediği görülür.
Bu gibi durumlarda hata yakalama komutu olan "TRY-CATCH" yapısına ihtiyaç vardır. Bu yapı oluşacak hataları kullanıcının görmesini ve gerekli düzeltmeleri yapmasını sağlamaktadır.
TRY-CATCH bloğunu ekleyerek SP’yi yeniden düzenleyelim.

Yeni SP aşağıdaki gibi olacaktır.



Eğer herhangi bir hata meydana gelirse bir hata kodu üretilerek kullanıcı bilgilendirilecektir.
Bu hata elektrik kesintisi, donanımsal yada programlama ile ilgili bir hata olabilmektedir.




Transaction Bloğunun Çalışması



SQL Server üzerinde herhangi bir veride değişiklik yapıldığı zaman, ilgili sayfalar daha önce diskten hafızaya çağrılmamış ise öncelikle tampon belleğe alınır.
Daha sonra üstünde değişiklikler yapılır.
Yapılan değişiklikler diske hemen yansıtılmaz. Bu şekilde içeriği denenmiş ama henüz diske kaydedilmemiş sayfalara kirli sayfa adı verilmektedir.
Sayfada meydana gelen her değişiklik *.ldb uzantılı transaction log dosyalarına kaydedilir. Kirli sayfaların diske kaydedilmesi işlemine «arındırma» adı verilmektedir.
Arındırma işlemi gerçekleşmeden önce kirli sayfalardaki tüm değişiklikler log dosyasına yansıdığı için işlem gerçekleşirken ortaya çıkacak olan istenmeyen durumlardan sonra eski haline dönmek mümkün olmaktadır.
Eğer herhangi bir sorun ortaya çıkmaz ise arındırma işlemi düzgün olarak gerçekleşir ve veriler diske yazılır.

Transaction’lar içerdikleri tüm işlemleri başarıyla gerçekleştiren ya da veri tabanı üzerinde hiçbir değişiklik yapmayan atomik yapılardır.
Olası bir durumda kurtarma işlemlerinin gerçekleştirilebilmesi için her işlemin ne zaman başladığı, ne zaman bittiği ve başarılı bir şekilde tamamlanıp tamamlanmadığı bilgisinin sistemde tutulması gereklidir. Bu sebeple kurtarma yöneticisi (recovery manager) şu bilgileri saklamaktadır

BEGIN TRANSACTION: Transaction’ ın başlangıcını işaretler.
READ/WRITE: Transaction’ın içeriğinde gerçekleştirilen işlemlerin bilgisini içerir.
END TRANSACTION: Transaction’ın bitişini işaretler.
COMMIT: Transaction’ın başarıyla sonuçlandığı bilgisini içerir.
ROLLBACK/ABORT: Transaction’ın başarısız olduğu bilgisini içerir.


Bir transaction’ın çalışması aşağıdaki gibidir.




Transaction Kuralları




Bir veritabanı veriler üzerinde değişiklik yaparken dört kuralı sağlamak zorundadır. Sağlanması gereken bu dört kural aşağıdaki gibidir.
Bölünmezlik (Atomicity)
Bir transaction bloğu asla yarım kalamaz. Ya hepsi gerçekleşmiş sayılır yada hiçbir işlem gerçekleşmemiş kabul edilerek başa dönülür. Başka bir ifade ile transaction, daha küçük parçalara ayrılamayan işlem birimi olarak ele alınır.
Tutarlılık (Consistency)
Transaction veritabanının yapısını bozmadan işlem bloğunu terk etmelidir. Yani ara işlemler yapılırken işlem bloğunun etkisini veritabanına yansıtarak transaction’ı terk edemez.
Örneğin A kullanıcısının hesabından parayı azaltıp B kullanıcısına eklemeden işlemi sonlandırmaz. Veritabanının mutlaka tutarlı olması gerekmektedir.
İzolasyon (Isolation)
Farklı transaction’lar birbirinden farklı olarak ele alınmalıdırlar.
Her transaction için veritabanının yapısı ayrı ayrı korunmalıdır.
İlk transaction tarafından yapılan değişiklikler ikinci transaction’da görülmemelidir. Ancak işlem bittiğinde bir bütün olarak görülmelidirler.
Dayanıklılık (Durability)
Tamamlanmış bir transaction’nın hatalara karşı esnek olması gerekmektedir.
Elektrik kesilmesi, herhangi bir donanım arızası gibi nedenlerden dolayı yapılacak işlemlerin gerçekleşmesine engel olması gerekmektedir.
Bunun için gerçekleşmiş ve başarılı olmuş transaction’nın değişikliklerinin diske kalıcı olarak yansıtılması gerekmektedir.

Transaction - Temel Bilgiler



Önce transaction bloğu çalıştırılır. Transaction bloğunun çalıştırılması ile bütün işlemlerin bir bütünlük arz ettiği ve her an tamamının geçersiz sayılabileceği tanımlanmış olur.
Bütün işlemler transaction log’ ların da tutulur ve herhangi bir problemde bu log’ lar dikkate alınır. 
Transaction bloğu SQL Server tarafından otomatik olarak veya kullanıcı tarafından «BEGIN TRANSACTION» komutu ile başlatılabilir.
BEGIN TRANSACTION yerine BEGIN TRAN komutu da kullanılabilmektedir.


Transaction bloğunda yapılan her işlemin başarılı olup olmadığı, her biten işlem sonunda kontrol edilir. Eğer başarılı olunmadıysa yapılan işlem geri alınır.
Geri alma işlemi «ROLLBACK» komutu ile gerçekleştirilir.
Başarılı olunduysa bir sonraki işleme geçilir.
Bu işlemler kullanıcı tarafından ve SQL Server tarafından gerçekleştirilebilir.

Tüm işlemler tamamlandığında «COMMIT» işlemi ile tüm veriler yeni hali ile veritabanına kaydedilir.
Eğer işlem başarısız olursa «ROLLBACK» komutu ile bütün işlemler tekrar en başa alınır ve yapılacak olan işlem veritabanına yansıtılmaz.

Örnek: Transaction

Bir banka sistemini ele alarak bir havale işlemini gerçekleştirelim.
A kullanıcısı B kullanıcısına havale yaptığında;
A kullanıcısının hesabından havale edilecek olan miktar düşülür. Ardından B kullanıcısının hesabına bu havale miktarı eklenir ve havale işlemi gerçekleşmiş olur.
Ancak her zaman bu şartlar sağlanamamış olabilmektedir. Örneğin, A kullanıcısı para havale ettiğinde elektrikler kesilebilir yada programda bir hata meydana gelebilir. Bu gibi bir durumda neler olabilir?

Transaction Nedir?


Transaction veri tabanındaki verilere erişen ve çoğunlukla bu veriler üzerinde değişiklikler yapan bir program kesimidir.
Birçok kullanıcının eşzamanlı olarak işlem yaptığı büyük veri tabanı sistemlerinde daha çok kullanılmaktadır.
Bir işlem büyük bir bütünün parçası olabilir. Bu işlemlerden herhangi bir tanesinin gerçekleşmemesi bütün işlemleri anlamsız kılmaktadır.
Böyle bir durumda bütün işlemler tek bir işlem gibi ele alınmalıdır. Bu parçalanamaz işlemlerin oluşturduğu yeni tek işleme «transaction» adı verilmektedir.


Transaction yönetim sistemleri (transaction processing systems) banka, otel rezervasyon, süpermarket gibi birçok kullanıcının eşzamanlı olarak işlem yaptığı büyük veri tabanı sistemleri için geçerlidir. Bu sistemlerin yüksek performansla ve doğrulukla çalışması son derece önemlidir.
Bazı durumlarda yapılan bir işlem büyük bir bütünün parçasıdır. Bu işlemlerden herhangi bir tanesinin gerçekleşmemesi bütün işlemleri anlamsız kılmaktadır. Bu durumda bürün işlemler tek bir işlem gibi ele alınmalıdır. Bu parçalanamaz işlemlerin oluşturduğu yeni tek işleme transaction adı verilmektedir. Bir diğer değişle transaction, daha küçük parçacıklara ayrılamayan işlem bloklarıdır.

Tablo Döndüren Fonksiyonlar



Bu tür fonksiyonlar çalışma prensibi bakımından view’ lara benzerler fakat farklı olarak dışarıdan parametre de alabilirler. Tablo döndüren fonksiyonların genel kullanım biçimi şöyledir.

CREATE FUNCTION [sahip-ismi] fonksiyon_adı ( [@Parametre_adı veri_tipi, …..] )
RETUNS TABLE
AS
RETURN (SELECT cümlesi)

Yazılan fonksiyon incelendiğinde RETURNS TABLE ifadesi ile bir tablo döndürüleceği belirtilmiştir. Daha sonra RETURN ifadesinde yazılmış olan SELECT cümlesi ile kullanıcıya geri döndürülmesi gereken kayıtlar sorgulanarak gönderilmiştir. Fonksiyonun çalıştırılması şöyledir.


Örnek-2: Genellikle E-ticaret sitelerinde yer alan ve bir ürünü alanlar bunları da satın aldı şeklinde karşımıza çıkan ürünlerin listesi yer almaktadır. Aynı şekilde bir kullanıcı kodu kullanarak böyle bir liste oluşturacak bir fonksiyon yazalım. Bunun için gerekli olan tablolar şunlardır. 
tblUrun: Ürün bilgilerinin yer aldığı tablodur.
tblSiparisDetay: Sipariş detaylarının yer aldığı tablodur.
tblSiparis: Siparişi verilen ürünlerin tutulduğu tablodur.


Bu fonksiyon belli bir ürünü satın alan kullanıcıya ait kullanıcı kodunun bulunmasını sağlamaktadır. Buradan elde edilecek olan kullanıcı kodu yazılacak olan ikinci fonksiyonda kullanılacaktır.

Bu işlem iki aşamalıdır. Yani iki ayrı fonksiyon yazılmalıdır. Bunlardan birincisi şöyledir:
CREATE FUNCTION AlanlarinKodu(@urunKod int)
RETURNS TABLE
AS
RETURN SELECT kullaniciKod FROM tblSiparisDetay SD
INNER JOIN tblSiparis S ON S.faturaKod=SD.faturaKod
WHERE urunKod=@urunKod


Bu fonksiyon belli bir ürünü satın alan kullanıcıya ait kullanıcı kodunun bulunmasını sağlamaktadır. Buradan elde edilecek olan kullanıcı kodu yazılacak olan ikinci fonksiyonda kullanılacaktır.


Bu fonksiyonda ise ürün kodu girilerek bu ürünü alan kişinin başka hangi ürünleri aldığı listelenmektedir.
Burada tblUrun ve tblSiparisDetay tabloları kullanılarak siparişi verilen ürünler tespit edilmiştir.
Ardından tblSiparis tablosu ve elde edilen bu liste faturaKod değerleri kullanılarak birleştirilmiştir.
Elde edilen yeni liste kullanıcı kodlarına bakılarak bu listede hangi kullanıcının hangi ürünü satın aldığı tespit edilmiştir.


İkinci yani asıl fonksiyonumuz ise şöyle olacaktır.
CREATE FUNCTION BunuAlanBunlariAldi(@urunKod int)
RETURNS TABLE
AS
RETURN
SELECT U.urunKod,U.urunAd FROM tblUrun  U
JOIN tblSiparisDetay SD ON SD.urunKod=U.urunKod
JOIN tblSiparis S ON S.faturaKod=SD.faturaKod
JOIN AlanlarinKodu(@urunKod) FNA ON
FNA.kullaniciKod=S.kullaniciKod

Bu fonksiyonda ise ürün kodu girilerek bu ürünü alan kişinin başka hangi ürünleri aldığı listelenmektedir.
Burada tblUrun ve tblSiparisDetay tabloları kullanılarak siparişi verilen ürünler tespit edilmiştir.
Ardından tblSiparis tablosu ve elde edilen bu liste faturaKod değerleri kullanılarak birleştirilmiştir.
Elde edilen yeni liste kullanıcı kodlarına bakılarak bu listede hangi kullanıcının hangi ürünü satın aldığı tespit edilmiştir.






Skaler Kullanıcı Tanımlı Fonksiyonlar

Skaler fonksiyonlar, bir işlem neticesinde sadece tek bir değer döndüren fonksiyonlardır.
SQL içerisinde tanımlı birçok skaler fonksiyon vardır.
Matematiksel, karakter, tarih fonksiyonları vb.
Örneğin SELECT GETDATE (l) komutu FROM ifadesi olmadan kullanılabilir. Bu tür yani GETDATE ( )  şeklindeki fonksiyonlar skaler fonksiyonlardır.
Bazı durumlarda kullanıcılarda bu tür fonksiyonlara ihtiyaç duyabilirler. Örneğin yapılan alışveriş neticesinde sepette kaç ürün olduğunu döndüren fonksiyon skaler bir fonksiyondur.

Skaler fonksiyonların genel tanımı şöyledir:
CREATE FUNCTION [sahip-ismi] fonksiyon_adı
(
@parametre_adı veri_türü,
….
)
RETURNS skaler_veri_tipi
AS
BEGIN
SQL_ifadeleri
RETURN skaler_deger veya değişken
END

Örnek: Bir müşteri kodunu girerek müşterinin sepetinde kaç adet ürün olduğunu bulan bir fonksiyon yazalım.




















Yazmış olduğumuz fonksiyona dikkat ettiğimizde RETUNS deyimi ile fonksiyonun integer tipte bir veri döndüreceği anlaşılmaktadır.
@Urun_sayisi olarak bir değişken tanımlandı.
Daha sonra SQL cümlesinde dışarıdan parametre olarak verilen kullanıcıKod bilgisi ile veritabanındaki kullaniciKod bilgisi karşılaştırılarak toplam ürün_sayısı hesaplandı ve @Urun_sayisi değişkenine aktarıldı.
RETURN komutu ile elde edilen bu ürün sayısı dışarıya tek bir değer olarak gönderildi.

Kullanıcı Tanımlı Fonksiyonlar


Kullanıcı tanımlı fonksiyonlar SQL Server 2000 ile gelen özelliklerden biridir.  Bu yapılar standart programlama dillerindeki fonksiyon mantığı ile aynıdır.
Fonksiyonlar belli bir sonucu geri döndürmek için tasarlanmış bir veya birden fazla yerde kullanılan yapılardır.
Kullanıcı tanımlı fonksiyonlar, tıpkı Stored Procedure’ler gibi dışarıdan parametre alabilirler.
Aynı zamanda IF…ELSE gibi T-SQL’in diğer ifadelerinin de kullanılmasına imkan tanırlar.
Kullanıcı tanımlı fonksiyonlar,  SP’ ler gibi derlendikten sonra tampon bir belleğe atanır ve daha sonra bu tampon bellekten çağrılarak kullanılabilirler.
Bir diğer özelliği de view (görünüm)’lar gibi bir tablo şeklinde kayıt döndürebilirler.

Bu fonksiyonları, View ve SP’lerden ayıran ve özellikle kullanılması gereken durumlar şöyledir:
Dışarıdan parametre alan view tanımlanamamaktadır. Fakat      böyle bir durum fonksiyonlarda kullanılabilmektedir.
SP’ler bir sorgunun parçası olarak birkaç durum dışında çalışmazken fonksiyonlar sorguların içerisinde kullanılabilirler.
Örneğin sp_helpdb, sp_helptext gibi prosedürler tek başlarına çalıştırılabilirler, fakat bir sorgunun parçası olarak çalıştırılamazlar.

SP’lerde Parametre Kullanmak

Standart prosedürlerde olduğu gibi SP’lerde de prosedürlere parametre gönderilerek bir sonuç üretilebilmektedir. Yani dışarıdan girdi parametreleri ile değer alabilmektedirler. Parametreli SP’ lerin genel kullanım biçimi şöyledir.

CREATE PROCEDURE prosedür_ismi
( @parametre_ismi veri_tipi, …..)
AS
SQL ifadeleri


Örnek: Bir kullanıcı kodu alındığında o kullanıcıya ait sepette yer alan ürünleri görmek istiyoruz. Bu işlem için tblSepet ve tblUrun tabloları kullanılacaktır.





SP’lerde Değişiklik Yapmak



Bir SP’de değişiklik yapmak için ALTER komutu kullanılmaktadır.
ALTER komutu ile geçen dersimizde anlatmış olduğumuz WITH ENCRYPTION komutu da kullanılabilmektedir. Bildiğiniz gibi WITH ENCRYPTION komutu kodların başkaları tarafından görülmesini engellemektedir.
ALTER komutunun genel kullanım biçimi aşağıdaki gibidir:

ALTER PROCEDURE Prosedür_ismi
AS
SQL ifadeleri

Sp_helptext ‘gunluk’ şeklinde çalıştırıp kodları görmek istediğimizde SP kodları görüntülenmeyecektir.

SP’lerin Oluşturulması



Bir kullanıcı tanımlı prosedür oluşturmanın genel biçimi aşağıda verilmektedir.

CREATE PROC/PROCEDURE prosedür_adı
AS
SQL ifadeleri

NOT: SP oluştururken PROC deyimi yada PROCEDURE deyimi kullanılmaktadır.

Örnek-1: Öğrenciler tablosu aşağıda verilmektedir. Bu tabloyu göz önüne alarak ortalaması 50’nin üzerinde olan öğrencileri bulan bir Stored Procedure yazalım.


CREATE PROCEDURE elliustu
AS
SELECT * FROM Ogrenciler WHERE ortalama >= 50


Oluşturulan SP’yi çalıştıralım. Bir prosedürü çalıştırmak için iki yol vardır. Doğrudan SP’nin ismini yazabilirsiniz yada exec SP_adi yazarak çalıştırabilirsiniz.




Örnek-2: Gün içerisinde yapılan satışları bulan bir SP oluşturalım. Bunun için tblSiparis ve tblSiparisDetay tabloları aşağıda verilmiştir.


Oluşturulacak olan SP aşağıdaki gibi olacaktır.




SP’lerin Çalıştırılması




SP’lerin performansı açısından ne sağladığını anlamak için kodlama aşamasından çalıştırılma aşamasına kadar bütün aşamaları çok iyi anlamak ve bilmek gerekmektedir.
Bu aşamaları şöyle sıralayabiliriz:
Ayrıştırma (Parsing),
Derleme (Compiling),
Çalıştırma (Executing).
Ayrıştırma işlemi sırasında SQL ifadelerinin geçerli olup olmadığı denetlenir.
Veritabanı içinde tablo, VIEW gibi başka nesneler varsa ve bunlara gönderme yapılıyorsa, bu nesnelere ait izinlerin olup olmadığı kontrol edilir.
Sorgu ağacı yada sıra ağacı denilen bir yapı ortaya çıkarılır.
Ardından SP’nin ismi sysobjects tablosuna kaydedilir. Daha sonra da syscomments tablosuna SP’nin kodları kaydedilir.

Derleme aşamasında, bir önceki aşamada oluşturulan sıra ağacı ele alınarak bir çalışma planı çıkartılır.
Bütün çalışma planı üzerinde güvenlik ve yetkiler denetlenir.
Bu çalışma planı, hangi aşamada hangi kontrollerin kullanılacağını veya tabloların kontrol edileceğini içermektedir.

Çalıştırma aşamasında, bir önceki aşamada elde edilen çalışma planı ele alınarak çalıştırma işlemi gerçekleştirilir.
Örneğin bir SELECT ifadesi kullanılmışsa sorgu veri işlemeden sorumlu DML yöneticisine iletilir.
Bir SP eğer ilk defa çağrılıyorsa, bu üç aşama gerçekleştirilir. Eğer daha önce çalıştırıldıysa sorgulama ağacı oluşturma işlemleri yapılmaz ve oldukça hızlı bir şekilde SP’nin derlenmiş hali çalıştırılır. Bunun nedeni SP’lerin derlenmiş birer nesne olmasıdır.

Kullanıcı Tanımlı Stored Procedure


Programcı tarafından programlanan prosedürlerdir.
Konu olarak en fazla üzerinde duracağımız prosedürlerdir.
Geçerli oldukları duruma göre üç’ e ayrılırlar:
Geçici SP’ler,
Yerel SP’ler,
Uzak SP’ler.

Geçici Stored Procedure’ler, özellikle SQL Server’ın eski sürümlerinde kullanılan bir türdür.
Her oturum açıldığında derlenmesi gereken SP’lerdir.
Yerel SP’ler ise, kullanıcı tarafından oluşturulan ve bu ders boyunca üzerinde duracağımız SP’lerdir.
Uzak SP’ler, dağıtık bir modelde tasarlanan ve uzaktaki bir sunucuda yer alan SP’lerdir.

Sistem Stored Procedure


sp_ ile başlayan prosedürlerdir.
Master veri tabanında tutulurlar.
Extended Stored Procedure’de olduğu gibi tam adlarının yazılması zorunluluğu yoktur. Sadece adını yazmak yeterlidir.
İstenirse tam ismi kullanılarak ta çalıştırılabilir fakat böyle bir zorunluluk yoktur.

Örneğin sp_helpdb sistem prosedürü veritabanı yönetim sisteminde yer alan veritabanlarını listeler.

CLR Stored Procedure



CLR (Common Language Runtime), Microsoft’un .NET mimarisi ile birlikte sunduğu yönetilebilir programlama platformudur.
CLR ve .NET dilleri ile SP’ler, kullanıcı tanımlı fonksiyonlar ve Trigger’lar gibi nesneleri kodlamak mümkündür. Dolayısı ile SP ve diğer nesneleri kodlamak için CLR’ ye ihtiyaç vardır. Bununla birlikle SP için çeşitli CLR prosedürleri’de beraberinde gelmektedir.
Güvenlik ve denetim gibi konularda CLR SP’ler, SQL Server için büyük avantaj sağlamaktadır.

Extended Stored Procedure

Genellikle .dll uzantısı şeklinde derlenmiş olan prosedürlerdir. 
T-SQL dışındaki C, C++, Visual Basic, Delphi gibi dillerde  yazılıp derlenirler.
Veritabanı uzayı dışında çalışırlar.
Sistem içerisinde hazır olarak gelen extended procedure’ ler genellikle xp_ öneki ile başlarlar, fakat sp_ öneki ile başlayan prosedürlerde vardır.
Bu sistem extended prosedürleri master veritabanı içerisinde tutulmaktadır. Tam nitelikli isimleri db.sahibi.sp-ismi şeklindedir.
Bütün sistem prosedürlerini master veritabanı altında görebilirsiniz. Örneğin veritabanına bağlanan kullanıcıları listelemek için aşağıdaki extended sistem prosedürü kullanılabilir.

Stored Procedure


Prosedür, belli bir görevi yerine getirmek için yazılmış program parçacıklarıdır. Başka bir deyişle, herhangi bir işlevi yerine getirmek için yazılan kodların bir paket içerisinde tutulmuş halidir.
Bir prosedür başka bir prosedür tarafından da çağrılabilmektedir. Bu da, sık kullanılan işlemlerin bir defa yazılarak programın akışına göre defalarca kullanılmasını sağlamaktadır. Böylelikle kod yazımı ve programlama işlemi kolaylaştırılmış olmaktadır.
Stored Procedure’ler diğer programlama dillerindeki fonksiyonlarla aynı işleve sahiptir.
Oluşturulan bir Stored Procedure’e ana program içerisinde bir komut ile ulaşılmaktadır.
Aynı komut defalarca verilerek procedure çalıştırılabilmektedir. Dolayısı ile procedure defalarca yazılmayıp tek bir defa yazılıp çağrılmış olmaktadır.
Stored Procedure’ler, ilk defa 1980’li yıllarda Sybase veritabanı sunucusunda kullanılmıştır.
Sorguların önceden hazırlanması ve veritabanı yönetim sistemi içerisinde saklanması en büyük özelliğidir. Dolayısı ile aynı uzayda çalıştığı içinde daha hızlı sonuçlar alınabilmektedir.
Bir SP oluşturulduktan sonra veritabanı içerisinde saklanmaktadır ve ihtiyaç duyulduğunda ise çağrılmaktadır.

Stored Procedure’ler, oluşturma şekillerine göre dört’e ayrılırlar:
Extended Stored Procedure’ler
CLR Stored Procedure’ler
Sistem Stored Procedure’leri
Kullanıcı Tanımlı Stored Procedure’ler

VIEW’ ları Şifrelemek


Bazı durumlarda View’ları oluşturan kaynak kodların başkaları tarafından görülmemesi istenebilir. Böyle bir durumda SQL Server’ın kendi içerisinde yer alan bir şifreleme mekanizması bu yapıları kullanıcı için şifreler. Burada dikkat edilmesi gereken en önemli nokta şifrelenmiş bir View’ın içeriğini biz dahil hiç kimsenin görememesidir. Bu nedenle şifreleme işlemi uygulanmadan önce kaynak kodların bir kopyasının mutlaka saklanması gerekir.


View’ları şifrelemek için ENCRYPTION komutu kullanılmaktadır.
ENCRYPTION komutu View oluşturulurken kullanılacağı gibi sonradan da kullanılabilir. Bu komutun genel yapısı şöyledir.

CREATE VIEW view_adı
WITH ENCRYPTION
AS
SELECT cümlesi

Burada dikkat edilmesi gereken bir diğer noktada, View’ın çalıştırılabileceği fakat kodlarının görülemeyeceğidir. Kaynak kodunu görmek için bir sistem prosedüründen faydalanalım. Query kısmına aşağıdaki komut yazıldığında ilgili View’ın şifrelendiğini belirten bir mesaj görüntülenir.
Şifreyi kaldırmak isterseniz View üzerinde yine bir değişiklik yaparak bunu yapabilirsiniz. Bunun için WITH ENCRYPTION komut satırını kaldırarak View’ı yeniden düzenleyebilirsiniz.

VIEW’ ları Silmek





Bir View’ı veritabanından kaldırmak(silmek) için DROP komutu kullanılmaktadır. Bu komut kullanıldığında view sistemden tamamen silinmiş olacaktır. DROP komutunun genel kullanımı aşağıdaki gibidir.

DROP VIEW view_adı

Örnek:
DROP VIEW Urunler

Birden Fazla Tablo Kullanmak



Bir JOIN komutu kullanılarak birden fazla tablodaki veriler bir VIEW oluşturularak defalarca sorgulanabilir. Genel olarak bu işlem için şöyle bir yapı kullanılır:

CREATE VIEW view_adı
AS
SELECT sütun_adları FROM tablo_1 JOIN tablo_2 ON birleştirme_şartı


VIEW’ larda Değişiklik Yapmak


Bir View üzerinde değişiklik yapılmak istenildiğinde ALTER VIEW komutu kullanılır. ALTER VIEW deyiminin genel yapısı aşağıdaki gibidir.

ALTER VIEW view_adi
AS
SELECT ifadesi

VIEW Sütunlarına İsim Vermek


View’lar da sütun adları isteğe göre değiştirilebilir. Eğer değiştirilmek istenmiyorsa filtrelenen ana tablodaki sütun adları ile aynı olacaktır.
Sütun adları ihtiyaca göre değiştirilebilir. View’larda sütun adları verilirken herhangi bir veri tipi belirtilmez. Bunun nedeni sorgulanan tablo baz alındığı için veri tipleri yine asıl tablodaki veri tipleri ile aynı olacaktır.

VIEW Oluşturmak

Görünümler tablolarla aynı özelliklere sahip olup en fazla 1024 tane sütundan oluşabilmektedir. Görünüm oluşturmak için CREATE VIEW komutu kullanılmaktadır.
Görünümün genel yapısı şöyledir:
CREATE VIEW view_adı
AS
SELECT sütunlar FROM tablo_adı


MS SQL Server üzerinde yeni bir Query açarak oluşturacağımız «bilgi» adlı View’a ait T-SQL kodlarını yazarak çalıştıralım.

Oluşturulan View’ lar ilgili veritabanının «views» sekmesinde yer almaktadır ve dbo.bilgi şeklinde görüntülenmektedir.
Oluşturduğumuz View’lar standart SQL komutlarına benzer şekilde çalıştırılmaktadır.
View oluşturma işlemini dilerseniz MS SQL Server’ da ilgili veritabanındaki «views» seçeneğini farenin sağ tuşuna basarak açılan menüden «New View…» diyerek te oluşturabilirsiniz.
«New View» seçeneğini tıkladığınızda karşınıza View’ı hangi tablo yada tablolardan oluşturacağınızı soran bir ekran gelecektir. Örneğimizi tblUrun tablosunu kullanarak yeniden yapalım.
tblUrun tablosu seçildiğinde View’da sorgulanması gereken alanların tek tek seçilmesi istenecektir.
Her seçilen alan bir SELECT ifadesi içerisine eklenir. Eğer bir filtreleme yapılacaksa Filter seçeneği içerisinde belirtilir.

VIEW (Görünüm) Nesnesi



Görünümler, veritabanı içerisinde önceden tanımlanmış tabloları kullanarak elde edilen geçici sanal tablolardır.
Bu tablolar veritabanında fiziksel herhangi bir yer kaplamazlar.
Görünümler, herhangi bir tablodaki belli alanların listelenmesini sağlarlar.
Bir veritabanı üzerinde eğer sık sorgulanan veriler var ise, bu verilerin hızlı ve basit bir şekilde sorgulanmalarını sağlamaktadırlar.
Tablolar olduğundan farklı gösterilmek istenildiğinde çeşitli filtreler kullanılır. Bu filtrelerden biri de görünümlerdir.
Görünümler kaydedilmiş sorgulardan oluşmaktadır.


Başka bir deyişle sorguları basitleştirmek bunların erişimlerini ve izinlerini düzenlemek, birbirinden farklı sunuculardaki benzer verileri karşılaştırmak ve bazı durumlarda da sorgu sürelerini kısaltmak için kullanılan gerçekte var olmayan sanal tablolardır.
Bu şekilde veritabanı üzerinde yer alan tablo yada tablolara daha kolay ve güvenli bir şekilde erişim yapılabilmektedir.


Bir görünüm ile birden fazla tablo üzerinde sorgulama yapılabilir. Bu haliyle karmaşık SQL ifadelerini daha da basitleştirmiş olur.
Oluşturulan bir görünüm ile veriler üzerinde herhangi bir güncelleme işlemi yapılamaz.
Bu yapılar sadece MS SQL Server, Oracle gibi ileri seviye veritabanı yönetim sistemlerinde bulunmaktadır. MS Access’ te bu yapılar yoktur.


Bir görünümün genel yapısı şekildeki gibidir.









Genel olarak görünümler aşağıdaki amaçlar için de kullanılmaktadırlar:
Kullanıcıların, bir tabloda yer alan sütun veya satırlarındaki  önemli verilerini görmek.
Tablolarda bulunan verileri başka bir tablo formatında göstermek.
Karmaşık sorguları basitleştirmek.