17 Ocak 2017 Salı

Web Sitesini Testti


Web sitesini test etmek için kullanılan en temel yöntem; web sitesini bir kara kutu olarak düşünmektir.
Test adımları
Bilgilerin doğruluğunu kontrol et.
Copyright notlarını ve tarihleri kontrol et.
Mouseover textleri kontrolleri.
Linkleri kontrolleri
Sistemin hazırladığı mail mesajlarını kontrol et.
Bütün resim dosyalarının yüklenip yüklenmediğini kontrol et.
Resim isimlerinin doğruluğunu kontrol et.
Resimlerin makul süreler içerisin de yüklenip yüklenmediği kontrol et.
Farklı noktalardan web sitesi çalıştırıp, sitenin çalışma zamanı kontrol et.

Web Site Formlarının Testti.

Formun içerisinde bulunan objelerin doğruluğuna bak.
Objelerin yerlerinin ve buyutların doğruluğuna bak.
Doğru dataları barındırmasını kontrol et.
Yanlış dataların sisteme girişine izin verilip verilmediğini kontrol et.
Veri girişlerinin rahat kullanıma sahip olup olmadığını kontrol et.

Trigger Oluşturmak

Genel olarak bir trigger oluşturma ifadesi şu şekildedir.
CREATE TRIGGER trigger_adı
ON tablo_adı
     {FOR AFTER/INSTEAT OF}    
     {INSERT/UPDATE/DELETE}
AS
      Çalışacak olan SQL ifadeleri


Örnek: Bir satış yapıldığı zaman stokta eğer ürün varsa otomatik olarak stoktan düşen, yoksa uyarı mesajı veren bir trigger yazalım.
Bu işlem için  öncelikle aşağıdaki tabloları oluşturmamız gerekir.
Müşteriler
Kitaplar
Satışlar
Bu tablolara ait nitelikler ve SQL ifadeleri şöyledir.

Müşteriler tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.



Ürünler tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.


Son olarak satışlar tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.

Oluşturduğumuz bu tablolara aşağıdaki gibi kayıtlar ekleyelim.

Tüm gerekli işlemlerin ardından herhangi bir satış yapıldığında stok miktarına bağlı olarak gerekli işlemleri yapacak olan trigger’ımız şöyle olacaktır.
Birinci kısımda bir trigger oluşturmak için CREATER TRIGGER komutunu ve bu trigger’ın hangi tablo üzerinde işlem yapacağını, ardından FOR INSERT ile bu trigger’ın bir ekleme işleminin ardından çalışacağını belirttik.

Burada müşteri numarası 1 olan kişi, 2 numaralı üründen 1 adet sipariş vermektedir.

Benzer şekilde satışlar tablosunda bir kayıt silindiğinde (iptal edildiğinde) çalışacak olan bir DELETE trigger’ı yazalım. DELETE trigger’ı için SQL ifademiz şöyle olacaktır.


Bu trigger ise satış sonrası fatura kesildikten sonra teslim edilen ürünleri silmek için kullanılabilir. Silinen kayıtlar daha önceden bahsettiğimiz gibi DELETED tablosunda tutulmaktadır.
Ayrıca bu trigger iptal edilen (yani ürünler tablosundan silinen) ürün adedini tekrar ürünler tablosuna eklemektedir.





Bu trigger’ıda çalıştırmak için SQL ifademiz şöyle olacaktır.


Benzer şekilde UPDATE trigger’ı ise aşağıdaki gibi olacaktır.
Burada DELETED olarak adlandırılan tablo, kayıt değiştirilmeden önce Satışlar tablosunda değiştirilmekte olan kayıttan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. INSERTED ise ayni satırın kayıt değiştirildikten sonra elde edilen satırdan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. Bunun nedeni aslında UPDATE bir DELETE ve INSERT işleminin ard arda uygulanması gibi düşünülmelidir.





Bir INSERT, UPDATE veya DELETE işlemi bir tabloya uygulandığında bu tablo üzerinde sırasıyla bir Instead Of INSERT, Instead Of UPDATE veya Instead Of DELETE Trigger’ı varsa bu işlem tablo üzerinde gerçekleşmez.
Onun yerine tetikleyici içinde yazılı kodlar yapılır. Bu işlemleri gösterebilmek için bir tablo oluşturalım. Bu tabloya ait nitelikler aşağıda verilmektedir.





Instead Of DELETE örneğine ait trigger aşağıda verilmektedir. Herhangi bir silme işlemi denendiğinde bu silme işleminin ne zaman denendiğini belirten bir trigger oluşturalım.





Bu denemeye ilişkin SQL ifadeleri ve sonuçları aşağıda verilmektedir.





Bütün INSTEAD OF trigger’ ları benzer şekilde;
Ekleme için Instead Of INSERT,
Güncelleme için Instead Of UPDATE,
Silme işlemi için ise Instead Of DELETE
    olarak oluşturulmaktadır.






Trigger’lar Nasıl Çalışır?





Trigger’ı tetikleyen bir olayla karşılaşıldığında işlem ile trigger ikisi birlikte bir transaction bloğu olarak ele alınır.
Trigger’lar çalıştığı zaman INSERTED ve DELETED tablolarını kullanırlar. Bu tabloların her ikisi de ana tabloyla yani trigger’ın tetiklediği tabloyla eşdeğer alanlara sahiptir.
Bu tablolar mantıksal tablo şeklinde RAM’de bulunurlar. Gerçek tabloya bir kayıt eklendiği zaman trigger çalışırsa bu kayıt aynı zamanda Inserted tablosuna da eklenir. İstenildiğinde bu tablodaki kayıtlara erişilebilmektedir.

Yani trigger, kendisini çağıran işlemi onaylamak anlamında hiçbir işlem yapmayabilir yada ROLLBACK ile geçersiz kılınabilmektedir.


Tablodan bir kayıt silindiğinde, silinen kayıt DELETED tablosunda saklanır.
UPDATE işlemi ise, DELETE ve hemen ardından yapılmış olan bir INSERT işlemi olarak ele alınır.
Bir kayıt UPDATE edildiğinde orijinal kayıt DELETED tablosuna eklenir.
Değişen kayıtta INSERTED tablosuna eklenir.

Klasik Trigger’ların Özellikleri

Bir trigger, birden fazla olayı gerçekleştirebilmektedir.
Örneğin bir tabloya kayıt eklendiğinde devreye giren bir trigger bu kayıtları başka bir yere de ekledikten sonra başka bir tablo üzerinde de güncellemeler yapabilmektedir.
Trigger, geçici tablo yada sistem tablosu oluşturamaz ama bu türden tablolara erişebilmektedir.

Diğer yandan bir trigger, birden fazla olay tarafından tetiklenebilmektedir. Yani hem ekleme hem de güncelleme işlemi için veya her ikisi için devreye girmek üzere programlanabilmektedir.

Temel olarak iki farklı trigger çeşidi vardır.
AFTER Trigger
AFTER trigger’ı sadece tablolar üzerinde tanımlanabilmektedir.
INSTEAD OF Trigger
INSTEAD OF trigger’ı hem tablolar hem de view’lar üstünde tanımlanmaktadır.

İkisi arasındaki en önemli fark, AFTER trigger’ını devreye sokan olay olmuş kabul edilerek akışı trigger’a bırakırken, INSTEAD OF trigger’ı istenilen işlemi gerçekleştirmez. Sadece sözde tablolara kaydetmekle yetinir. Ayrıca basamaklı güncelleme ve silme işlemine destek vermez.

Bu iki trigger’ ın karşılaştırılması tabloda verilmektedir.


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.