SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

VIEWS

Özellikle karmaşık sorgu cümleciklerini sadeleştirmek amaçlı View tanımlanır.View genellikle okuma(read) amaçlı kullanılıyor olsada,view’ler üzerinden günceleme,silme,ekleme işlemleride yapılabilmektedir.View’ler adı üzerinde sadece bir görünümdür.Verinin aslı değildir.Örneğin Product tablosunda Color özelliği ‘Silver’ olan ürünleri içeren bir view oluşturmak istediğimizde şöyle bir T-SQL komutu yazmalıyız;

CREATE VIEW v_Products

AS

      SELECT ProductID,[Name],Color,ListPrice

      FROM Production.Product

      WHERE Color='Silver'

 

Bu komutla birlikte v_Products isminde bir view oluşturulacaktır.View dediğimiz şey sadece ve sadece bir SELECT ifadesinin yerini v_Products isminin almasıdır.Yani View’daki veriler için harddiskin özel bir bölgesinde veriler tutulmaz.View dediğimiz şeyin içi boştur.Sadece bir SELECT ifadesini ifade eder.Dolayısıyla

SELECT * FROM v_Products

 

gibi bir ifade işletildiğinde, v_Products ifadesinin yerine yukarıdaki select ifadesi getirilir ve ana tabloda yani Production.Product tablosunda seçme işlemi yapılır.Dediğimiz gibi View sadece karmaşık sql ifadelerimizi arındırmak,onlara sabit bir isim vermek amaçlı kullanılmaktadır.Asıl veri View’da tutulmayıp,yapılan sorgu ana tablo üzerinden işletilmektedir.

Yukarıdaki örnekte sql ifademiz son derece basittir.Normalde böyle basit sql cümlecikleri için View kullanılmaz.View biraz öncede dediğim gibi çok karmaşık sql ifadelerinde(JOIN,  Aggregation( SUM, AVG vs.)) kullanılmaktadır.

Yukarıdaki ifadede view oluşturulduktan sonra bir başkası, bu sql server objesinin üzerine sağ tıklayıp ‘Script View As’ butonuna tıklayıp,View’ın orjinal T-SQL komutunu elde edebilir.Eğer karmaşık SQL cümleciğimizde pek çok tablodan veri çekiyor isek ve tablolarımızın yapısının,bilinmesini istemiyor isek,View sql cümleciğini diğer kişilerden saklamak istiyor isek,bu ifade veri tabanında şifrelenebilmektedir.Bunun için yukarıdaki T-SQL komutunu şu şekilde düzenlememiz gerekmektedir;

CREATE VIEW v_Products

WITH ENCRYPTION

AS

      SELECT ProductID,[Name],Color,ListPrice

      FROM Production.Product

      WHERE Color='Silver'

 

Bu durumda kullanıcı şifrelenmiş View sql’ine ulaşamayacaktır.İşin kötü tarafı sizde ulaşamayacaksınız. O yüzden Sql ifadenizi bir başka yerde muhaza etmeniz gerekmektedir.

Yukarıdaki ifadede Product tablosu üzerinden işletilmek üzere bir view oluşturulmuştur.Bu view sistemde kayıtlıdır.View oluşturduktan sonra,view’ın kullandığı tablolardan biri silinirse(drop edilirse), sistem hata vermeyecektir.Ama ardından view’i kullanmak istediğimizde hata alacağız.Bir View oluşturduğumuzda,view’in sql cümleciğinde kullandığımızda tabloların vs. silinmesini engellemek istiyor isek T_SQL komutumuzu şu şekilde düzenlememiz gerekmektedir;

CREATE VIEW v_Products

WITH SCHEMABINDING

AS

      SELECT ProductID,[Name],Color,ListPrice

      FROM Production.Product

      WHERE Color='Silver'

 

Bu durumda Product tablosu v_Products view’ı silinmeden,silinemeyecektir.

View gerçekleştirirken AS ifadesinden sonra SELECT ifadesi yazıyoruz.Bu SELECT ifadesinde bazı kısıtlamalar vardır.Bunlar şunlardır;

o   COMPUTE ve  COMPUTE BY ifadeleri içeremez.

o   INTO keyword’ü kullanılamaz.

o   OPTION keyword’ü kullanılamaz.

o   Geçici tablolara(temporary tables) referans edemez.

o   TOP ifadesi içermeyen ORDER BY keyword’ü kullanılamaz.ORDER BY kullanabilmek için ifadede TOP keyword’ü kullanılmalıdır.

v_Products ismindeki bir View eğer hem Product hemde ProductModel tablosundan veri çekiyor ise ve bu view’ı Ahmet kullanıcısı kullanmak istiyor ise,Ahmet kulanıcının sadece view üzerinde hak sahibi olması yeterli değildir.Ahmet’in bu view’ı kullanabilmesi için Product ve ProductModel tablolarının sahipleri Ahmet’e bu tablolar üzerinde SELECT izni vermeleri gerekmektedir.Yani Ahmet’in bu view’i kullanabilmessi için hem v_Products view’i hem Product hemde ProductModel tabloları üzerinde SELECT iznine sahip olması gerekmektedir.

View’ler Üzerinden Güncelleme Yapmak

Bir view üzerinde INSERT,UPDATE,DELETE işlemleri yapabilmemiz için view birden fazla tablo içermemelidir.AVG,SUM,COUNT,MIN,MAX gibi alanlar üzerinden güncelleme yapılamaz.,

Yukarıdaki örnekde Product tablosundan Color özelliği ‘Silver’ olan ürünleri getiriyorduk.Eğer View üzerinden Product tablosuna bir kayıt eklemek istiyor isek bu kaydın Color özelliği ‘Silver’ değil ise,kayıt asıl tabloya yine eklenecek fakat view üzerinden görüntülenmeyecektir.Bu durumu engellemek için WITH CHECK OPTION ifadesini kullanıyoruz.Color özelliği ‘Silver’ olmayan kayıtları view üzerinden tabloya eklenmesini engellemek istiyor isek bu durumda T-SQL ifademizi şu şekilde değiştirmemiz gerekmektedir;

CREATE VIEW v_Products

AS

      SELECT ProductID,[Name],Color,ListPrice

      FROM Production.Product

      WHERE Color='Silver'

WITH CHECK OPTION