Alper ÇELİK

Bilgisayar Mühendisi

View'ler Hakkında Herşey

VIEW NEDİR ?  
 
View'ler içeriği bir sorgu tarafından tanımlanan sanal tablolardır. Tıpkı bir tablo gibi satır ve sütundan oluşurlar. View'lere farklı nedenlerden dolayı ihtiyaç duyabiliriz, bunlar; güvenlik gereği kullanıcıya belirli sütun veya satırları göstermek(ana tabloda bulunan maaş kolonunu saklamak gibi), farklı base table(ana tablo)'larda bulunan kolonları bir araya getirip ihtiyaç dahilindeki kolonları bir seferde görmek ya da çok karmaşık sorguları her defasında yazmak yerine o sorguları view haline dönüştürüp tablo gibi kullanmak gibi ihtiyaçlar için kullanabiliriz.
 
En basit haliyle bir view yazım şekli şöyledir:  
 
CREATE VIEW view adı
AS
SELECT sütun isimleri
FROM tablo adı
 
 
Not: View'ler, içeriğinde herhangi bir data depolamazlar. Sadece kaydedilmiş SELECT cümlesi barındırırlar. Bu yüzden sanal tablo olarak isimlendirilirler. Zaten (sp_helptext viewAdı) sorgulamasını yaptığınızda text metinde bunu açıkça görürsünüz.
 
Not2: View içersinde aggregate fonksiyonlar kullanılabilir.
 
View'ler içersinde sütun adlarına takma ad(alias) verebilirsiniz:
(AdventureWorks2012)
 
 
CREATE VIEW vwUrun
(Ad, Renk)
AS
SELECT Name, Color FROM Production.Product WHERE Color is not null  
 
Not3: View'ler içersinde geçici tablolar(temporary tables), ana tabloymuş gibi kullanılamazlar. Yine ORDER BY elementi view'ler içersinde kullanılamaz.
Not4: Bir view'in bağlı olduğu tablolar ve bu tabloların sahiplerini sp_depends sistem stored prosedürü ile sorgulayabiliriz,  
Not5: View içersinde tekrar başka bi view kullanılabilir,  
Not6: View'lere parametre geçilemez bunun yerine table valued fonksiyonlar kullanmalısınız.
 
 
VIEW'LER UPDATE İŞLEMLERİNE SOKULABİLİR Mİ ?  
 
Şayet view gövdesinde bir adet ana tablo(base table) var ise herhangi bir problem olmadan DML işlemlerini yapabilirsiniz. Ancak yapılacak olan update işlemi birden fazla tabloyu ilgilendiriyor ise bu durumda ana tablolarınız bundan kötü etkilenecektir ve beklenmedik şekilde diğer tablolarınız da güncellenebilecektir. Dolayısıyla böyle bir ihiyaç söz konusu ise INSTEAD OF TRIGGER'ları kullanılmalıdır.  
 
VIEW'LERİ YÖNETMEK   
 
View'lerin kodlarını değiştirip, başkaları tarafından görülemez yapabilir aynı zamanda view'lerdeki verileri yönetebilirsiniz.
Bir view üzerinde değişiklik yapabilmek için ALTER deyimini kullanabilirsiniz:
 
ALTER VIEW view adı
WITH secenekler
AS
SELECT cümlesi
 
Yukarıdaki ifadede seçenekler kısmınına ENCRYPTION ya da SCHEMABINDING gelebilir. SELECT cümlenize kısıtlayıcı bir tanım getirmek istiyor iseniz WITH CHECK OPTION  ifadesini kullanıyor olmanız gerekir.  
 
Bir veritabanında hangi view'lerin tanımlanmış olduğunu görmek istersek, başvuracağımız sistem viewleri şunlar olacaktır:
 
* INFORMATION_SCHEMA.VIEWS
* INFORMATION_SCHEMA.VIEW_TABLE_USAGE
* INFORMATION_SCHEMA.VIEWS
* SYS.VIEWS  
 
 
ENCRYPTION: Şayet oluşturduğunuz view'ın kaynak kodlarının başkaları tarafından görülmesini istemiyor iseniz bu yapıyı kullanmalısınız. Bu durumda ilgili kaynak koda yapıyı oluşturan kişi dahil kimse erişemez dolayısıyla bu işlemi yapmadan önce kaynak kodun benzerini bir yerlere kopyalamakta fayda var. Şayet şifreleme işleminden vazgeçmek istiyor iseniz WITH ENCRYPTION ifadesini kaldırıp view'ınızı yeniden ALTER etmeniz gerekir.
 
SCHEMABINDING: Bu operatörün görevi, view'e ait temel tabloların şemalarında değişiklik yapılamayacağına dair bir kilitleme sağlamaktır. Bu operatörün bağlı olduğu view'lerde temel tabloların sütunları silinemez ya da türleri değiştirilemez. Bu ifadeyi kullanırken dikkat edilmesi gereken 2 temel kural vardır:1.si, nesneyi oluştururken kullanılan sütun isimleri tüm kolonlar anlamına gelen (*) ile geçilemez. Bunun yerine gerekli kolonları tek tek tanımlıyor olmanız gerekir. 2. kural ise, SCHEMABINDING ile oluşturulan nesneler sahip.tabloadı şeklinde 2 kısımda oluşturulması gerekir. DBO deyimi dediğimiz kısmın kullanımı zorunludur. Hatırlarsanız scalar fonksiyonları da bu şekilde çağırıyor idik.
 
WITH CHECK OPTION: Bu ifade kısıtlayıcı bir tanımdır. Şayet insert yapılan bir view'e WHERE koşulunda belirttiğiniz parametrelerin kayıt edilmesini istiyor iseniz bu ifadeyi kullanmanız gerekir. Örnek yazım şekli şöyledir:
 
CREATE VIEW view adı  
AS  
SELECT cümlesi  
WITH CHECK OPTION
 
VIEW'LERE INDEX TANIMLAMA    
 
Sql Server'da "Indexed Views", Oracle'da ise "Materialized Views" olarak tanımlanan bu kavram bol join yada hesaplama içeren sorgularda performanslı sonuçlar üretmek amacıyla kullanılırlar. Bildiğiniz gibi view'ler SELECT cümlelerinden oluşmuş sanal tablolardır, içersinde data'yı depolamazlar ANCAK siz bir view üzerinde index yarattığınızda o view artık sanallıktan çıkar ve somut bir hale gelir. Bunun anlamı, 'ilgili view artık data'yı depolayacak kadar yetenekli hale gelmiştir', anlamı taşıyor.   
Yalnız view oluşturmanın bazı kâideleri var elbette. Her view için index oluşturamıyoruz:
1- View'ın SCHEMABINDING ile oluşturulması gerekiyor,
2- GROUP BY ile aggregate fonksiyon kullanacak isek COUNT yerine COUNT_BIG(*) kullanmamız gerekir,
3- Index tanımlanacak view içersinde ana tablolar 2 kısım şeklinde belirtilmelidirler(dbo.tabloAdı gibi),
4- SELECT cümlesi içersinde * yerine ihtiyaç olunan kolonlar tek tek yazılmalıdırlar,
5- SELECT cümlesi içersinde NULL dönmesi ihtimali bulunan kolonlar için önlem alınmalıdır(ISNULL() veya CASE WHEN gibi),
6- ORDER BY kullanımı yasaklanmıştır(bu özellik bildiğiniz gibi view'ın genelinde zaten yasaktır),
7- Index'ın tanımlı olduğu view'lerde başka bir view tanımlı olamaz,
8- Index tanımlanacak platform Enterprise versiyon olmalıdır,  
 
Tüm bu koşullar sağlandıktan sonra view üzerinde UNIQUE CLUSTERED INDEX tanımlayabiliriz. Yazım şekli şöyledir:
 
CREATE UNIQUE CLUSTERED INDEX UC_indexAdı
ON viewAdı(kolonAdı)  
 
Indexed view'ler data'nın çok fazla manipülasyona uğramadığı yerler için ideal'dir. Yani OLAP ve DW(datawarehouse) tarzı sistemler için uygundur zira bu platformlarda data çok fazla değişime uğramaz. Data'nın analizi ve raporlaması söz konusudur. Öte yandan OLTP türü sistemlerde indexed view üzerinden yapılacak DML işlemleri performansa çok fazla getirisi olmayacak işlem türleridir. Indexed view'lerin, indexed table'lara göre bakımı da daha zordur üstelik..Bu yüzden indexed view kullanacak iseniz OLTP türü sistemler yerine OLAP tarzı sistemlerde kullanmanız daha sağlıklı olacaktır.  
 
View'lerle alakalı makalemin sonuna gelmiş bulunuyoruz, umarım faydalanmışsınızdır, bir sonraki makalemde görüşmek üzere.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Trigger Serisinin İlk Bölümüne Buradan Ulaşabilirsin

Trigger'lar özelleşmiş bir tür stored prosedürlerdir(SP).