Makale Özeti

Sql server uzerinde view tanımlamalarını inceleyip view ile neler yapabileceğimizi detaylı olarak inceleyelim.

Makale

View Nedir ( Tanımlamak Kullanmak Detaylandırmak Sifrelemek ve Silmek )

Merhabalar makalem boyunca AdventureWorks database ini kullanarak view yapılarını anlatacağım .

Konumuza geçmeden önce sunu düşünelim bir view a neden ihtiyaç duyarız bize ne gibi bir faydası olur nelerden yararlanmamıza yardımcı olur .

Firmamızda MsSql veri tabanı üzerinde bulunan verilerimiz olsun ( mesela otomotiv firması ) Satış grubundaki personellerimiz sadece aracın marka - model - model uzantı - km - satış fiyatı ve ıskonto oranı seklinde bilgileri görmesini isteyelim .

Tablo yapısında düşünürsek alış fiyatı kar ve gerçek alıcının bilgilerinin o tablo üzerinde tutulduğunu varsayalım.

Satış elemanlarımızın o tablo üzerinde select sorgusu yetkisi olsa idi select * from Arac seklinde aracımızın yukarıda belirlediğimiz tüm verilerini görebilirdi.

İste bu gibi durumlarda bir view tanımlarız ve satış grubundaki personellerimize sadece bu kural için bu view üzerinde select sorgusu tanımlamasını veririz . Bu şekilde istediğimiz bicimde bilgiye ulaşmalarını sağlayabiliriz .

Diğer bir yandan parçalı bir tablo kullanıyoruz select sorgumuz çok kompleks ve çoğu yerde bunu çağırmak zorunda kalıyoruz . Bu sorgumuzu bir view a bağlar ve sadece view adından sorgumuzu çağırırız . En önemli olan nokta ise view kullanmadan kullanırsak herhangi küçük bir değişiklikte ( örneğin tabloya bir sütün daha ekleyip listeleyeceğiz ) tüm tanımladığımız yerlerden sorgumuzu düzeltmek zorunda kalırdık. View kullanarak oluşturulan sorgularda sadece o view üzerinden yapılan değişiklik tabiî ki tüm o view’ı kullanan sorgularımızı da etkileyecektir .

Uygulamamızda Türkçe İngilizce Japonca gibi farklı dillerde sorgularımızın adlarını değiştirip kullanmamız gerekir bu şekilde ve yukarıdaki şartlardan birini daha ekleyip düşündüğümüz zaman içinden çıkılmaz sorgular bizi beklemektedir. View tanımlayıp tüm bu dertlerden kurtulabiliriz .

Simdi en basit şekilde bir view oluşturalım . Örneğimizde AdventureWorks database i içerisinde Production.Product tablomuz dan yaralanalım .

Urunun ProductID - Name - ProductNumber - Color - ListPrice bilgilerini gösteren bir view oluşturalım .

Create view vw_urun_satis_grubu
(IdNumarası,Adı,UrunNumarası,Rengi,ListeFiyatı)
As
Select ProductId,Name,ProductNumber,Color,ListPrice from Production.Product

Seklinde bir view oluşturduk simdi oluşturduğumuz bu view ı inceleyelim . İlk olarak Create view vw_urun_satis_grubu seklinde bir view tanımlayacağımızı sisteme bildirmiş olduk artık sql server bizim bir view tanımlaması yapacağımızı bilir .
(IdNumarası,Adı,UrunNumarası,Rengi,ListeFiyatı) parantezleri arasına yazdıklarımız sütunların bizim belirlediğimiz isimleridir view çalıştığı zaman sütün isimleri bu şekilde karsımıza çıkacaktır ama burada dikkat etmemiz gereken en önemli nokta verilen sıraya uygun select cümleciklerinin yazılması dır . Eğer verilen seklin dışında select cümleciklerimiz yazılır ise tablo adları anlamsız olacaktır.

Yukarıda en basit hali ile bir view tanımlamadı yaptık . Şimdi bunu kullanalım.

Select * from vw_urun_satis_grubu

seklinde bir tanımlama da select ifademiz bizim view içerisinde belirttiğimiz sütunları getirecektir bu şekilde Production.Product tablomuz üzerinde herhangi bir erişim tanımlamasına gerek kalmadan direk olarak view üzerinden select sorgusu yapabilir seklinde bir tanımlama bizim işimizi çözülecek tir.

Simdi birde su şekilde örnek yapalım . Production.Produc tablomuzdaki ürünlerimizin sadece listPrice larının 40 dan büyük olanlarını ekrana bastıralım ve view içinde biraz datalarımızı eleme sekilerline gecelim .


select sorgusunun yanına where tanımı yapalım ve sadece select sorgumuzu değiştirelim.

select * from vw_urun_satis_grubu where ListeFiyatı>100

select sorgumuza where şartını ekledik ama burada dikkat etmemiz gereken çok küçük bir ayrıntı var . Eğer biz sorgumuzda ListPrice > 100 deseydik sql server hata verecekti . bunun nedeni view oluşum aşamasın da ListPrice sütununa ListeFiyatı olarak belirlememiz dir . Sql server sorguyu view üzerinden çalıştırdığı için base tablo üzerindeki sütun adına bakmaz eğer biz bir sütun tanımlaması yapmış isek.

View sorgularımız içerisinde bir çok hazır fonksiyon ve bizim yazdığımız store procedure leri kullanarak daha da ayrıntılı aramalar yapmamız sağlanır. Peki, Hangi tabloda hangi view tanımlı seklinde ki bir sorunun sonucuna nasıl ulaşırız.

Select * from INFORMATION_SCHEMA.VIEW_TABLE_USAGE


Yukarıdaki şekilde system view yapılarını kullanarak kendi database imiz içerisindeki view larımızın bir çok bilgisine erişebiliriz . Yukarıda database imiz de tanımlı olan view larımızın bir listesi verilmiştir . Bu listedeki en sıklıkla kullanacağımız iki sütun adı View Name ve Table Name kısmıdır burada hangi view hangi tablo üzerinde işlem görmüş bunu yakalarız.

Peki view oluşturduk ve daha sonra bu view için yazdığımız o kompleks sorgumuzu unuttuk ve bulamıyoruz uğraşmakta istemiyoruz view çalışıyor ama bu sorgu nerde bunu nasıl buluruz.

INFORMATION_SCHEMA.VIEWS : sistem view ını kullanarak view larımızın iç yapılarını görebiliriz.
View içindeki komutlarımız ada bu şekilde tekrar erişebiliriz.

Select * from INFORMATION_SCHEMA.VIEWS

Yukarıdaki tanımlamada da göründüğü gibi view larımız hakkında bilgi almak için sistem view larını kullanmak en kolay ve en hızlı çözümleri bize sunmuştur .

Sistem viewlarını biraz inceleyelim .

sys.databases : sql server üzerindeki tüm database lerimizin listesini ve özelliklerini verir .

sys.foreign_keys : Veritabanımız üzerindeki tanımladığımız foreign key lerimizin listesini özelliklerini verir .

sys.sql_logins : Bağlı olduğu database üzerinde login işlemi yapabilecek kullanıcıların listesini verir . Password kısımları hash li olarak gelir güvenlik nedeni ile …

sys.sysusers : Sql server içinde tanımlı olan sistem kullanıcılarının listesini verir . Password kısımları hash li olarak gelir guvenlik nedeni ile

sys.views : Bağlı olduğu tablonun view larının listesini verir .

INFORMATION_SCHEMA.CHECK_CONSTRAINTS : Bağlı olduğu tablonun check constraint lerinin listesini verir . bu listenin içinde CHECK_CLAUSE sütununda tanımladığımız kurallarımızı görebiliriz .

Daha fazlası için kendi database imiz veya herhangi bir database in views kısmından System.Views bölümünden sistem view larını görebilir deneyip sonuçlarını inceleyebiliriz .

Buraya kadar view oluşturduk kullandık peki su şekilde düşünelim öyle bir view yazmalıyız ki bizim yukarıda yaptığımız gibi insanlar bizim viewlarımızın kod kısmını görmesinler hangi tablolardan hangi veriler çektik nasıl isimlendirdik hiç bir bilgimiz gözükmesin . biz dahi göremeyelim . 

Simdi bir view oluşturalım HumanResources.Employee tablosu icerisindeki verilerden bize evli ve erkek olanların tüm bilgilerini versin .

Create view evliveerkekler
as
Select * from HumanResources.Employee where Gender = 'M' and MaritalStatus = 'M'

View ımızı oluşturalım ve bu view ımzın içerisinde barındırdığı select sorgusunu ilk önce bulalım . bakalım sql server bu view tanımını nerde nasıl tutuyor .

Select * from Information_schema.views

Seklinde viewlarımızın içerisini görebiliriz hangi select sorgusunu nasıl çalıştırdığını bulabiliriz. Biz bunu engellemek istiyoruz . bulunamasın sql server buna izin vermesin .
Tanımladığımız view larımızın başkası tarafından içersindeki sorgumuzun görülmesini istemiyor isek ENCRYPTION söz dizimi alter view [view adı ] dan sonra with deyimi ile kullanılır .

Alter view evliveerkekler
with ENCRYPTION
as
Select * from HumanResources.Employee where Gender = 'M' and MaritalStatus = 'M'

Artık Select * from Information_schema.views yordamını çalıştırdığımız zaman bu view imizin detayı yani içerdiği kod blokları gözükmeyecektir . Null olarak kalacaktır.

Not : Burada şuna çok dikkat etmek gerekir . eğer biz sorgumuzu veya herhangi bir sebep ile view imizi yeniden düzenleyecek isek bile with ENCRYPTION seklinde yinede kullanmalıyız Eğer ki kullanmaz isek sql server şifrelendirmeyi pasif hale düşürür . Kodlarımız yukarıda bahsettiğimiz gibi Select * from Information_schema.views komutu ile iç yapıları görünülür olur.

Oluşturduğumuz veya üzerinde gerekli yetkilerimiz olduğu bir view silmek icin Drop cümleciği kullanılır.

Drop view [view adı] seklinde yazılması yeterlidir . komut çalıştığı zaman belirttiğimiz view eğer yetkimiz tanımlanmış ise silinir .

View tanımladık dan sonra view lar üzerinde insert delete veya update gibi işlemlerde yapabiliriz . Ama bu işlemleri yapmadan önce belli baslı kriterlere uygun olup olmadığını kontrol etmemiz gereklidir .

İnsert update veya delete yapıcagımız view cagırdıgı tabloda not null degerlerinden birini dahi cekmiyor ise bu islemleri view uzerinden gerceklestiremeyiz . Kısaca ilsem yapıcagımız view base tarafda cagırdıgı tablo icerisindeki contraint index lere takılmaması gerekir .

Makalemiz boyunca adventureworks database ini kullanarak örnekler verdik ve view ların yapılarını çalışma prensiplerini anlamaya çalıştık.

Son olarak şunu tekrar söylemek view ların amaçları için daha uygun olur. Yetkilendirme işlemlerinde bir tablo üzerinden select sorgusu ile tüm datanın elde edilmesini istemiyor isek yetki vermek istediğimiz kullanıcımızı oluşturur daha sonra kullanıcımıza sadece tanımladığımız view üzerinden yetki verilir. Kullanıcımız ister sql üzerinden ister baksa bir programlama dili üzerinden sql server a kendisine verdiğimiz kullanıcı adı ve şifre ile bağlanacağı için sadece bizim tanımladığımız view üzerindeki yine bizim tanımladığımız işlemleri yapması sağlanır bu şekilde veri güvenliğimiz ide biraz sağlamış oluruz.

Kısaca verilerimizi view tanımlamalarımız sayesinde istediğimiz kullanıcılara kontrollü açmaktır .