23 Eylül 2015 Çarşamba

SQL VIEW YAPISI

View'ler bir veya birden fazla tablodan istenilen verilerin bir arada sunulmasını sağlayan tanımlanmış sorgulardır. Diğer bir deyişle sanal tablolardır.Sanal tablo ile geçiçi tabloları birbiri ile karıştırmayalım 
Sanal tablo demek ; Aynı gerçek tablolar gibi satırlar ve sütunları içermesi demektir.Bir ya da birkaç tablodan seçtiğimiz komplike verileri bu sayede okumayı sağlar. Dolayısıyla birden fazla inner join içeren sorguları view ile kullanmak mantıklıdır.

Peki neden “sanal” kelimesini kullanıyoruz? Çünkü View'ler veri saklamazlar sadece istenen veriye ulaşılacak yolu kullanarak verileri kullanıcıya sunarlar. 

Buradan da anlıyoruz ki ,view ile birden çok tabloyla çalışırken uzun sorgulardan kurtululabiliyoruz.Böylelikle veri ulaşım performansını arttırabiliyoruz.Ve birazdan bahsedeceğimiz yapılar sayesinde veri erişimini sınırlamak ve kontrol altında tutmak için view’ları kullanabilirz.


USE NORTHWND
GO

CREATE VIEW [dbo].[Order_Customer]
AS
SELECT Orders.OrderID,Orders.OrderDate,Orders.ShipName,
Customers.CompanyName,Customers.City,Customers.Country
FROM dbo.Customers
Inner join dbo.Orders ON Customers.CustomerID=Orders.CustomerID

Oluşturulan Viewler  Object Explorer kısmında "View" ana başlığı altında toplanır.


View’ler ile ilgili bazı dikkat etmemiz gereken noktalar:
View ler temporary tablo dediğimiz geçici olarak oluşturulan tablolara referans verilemez.Bu tablolardan veri istenemez. 
View ler üzerinde yapılan değişikler kendilerini oluşturan kaynak tabloları da etkiler,aynı değişiklikler kaynak tablolara da yansır.
-Order By cümleciği sadece TOP operatörü ile birlikte kullanıldığında kullanılabilir. 
-Bir View farklı tablolardan gelen aynı isimlere sahip farklı sütunları içerebilir. 
-Ya da İsimsiz kolon bırakamazsın. As ile takma bir isim vermeniz gerekiyor.
-Birden fazla sırgu yapamazsınız yani sadece bir tane select ile başlayan bir cümle yazabilirsiniz.


CREATE VIEW view_ismi [(görünen sütun ismi,…)] 
[WITH {ENCRYPTION | SCHEMABINDING}] 
AS 
select_cümlesi 
[WITH CHECK OPTION] 


Create View [sahip_ismi].view_ismi kısmındaki [sahip_ismi] alanını doldurmak zorunda değiliz.O view’in kim tarafından yönetileceğini belirtmek yararımıza olacağı için belirtmemiz iyi olur.Çünkü hiçbir isim girilmemesi durumunda o sıradaki kullanıcıyı View’in sahibi olarak atayacaktır. 

Şifreli View Oluşturma (With Encryption)

USE NORTHWND
GO

Create VIEW[dbo].[ProductsDetails]
With Encryption
AS
SELECT Prod.ProductName,Cat.CategoryName,Prod.QuantityPerUnit,Prod.UnitPrice
FROM dbo.Products as Prod
INNER JOIN dbo.Categories as Cat ON Prod.CategoryID=Cat.CategoryID

Encryption yapısını kullanmamızın nedeni o veritabanında oluşturduğumuz View’in kod içeriğinin yani View’i oluşturmamızı sağlayan kaynak kodun görüntülenemez şekilde şifrelenmesidir.Yani Şifreli view ın kodlarını kendimiz de göremeyiz demek design sayfasına ulaşamayız yani inaktif olarak görünür.

Diğer bir deyişle Kaynakların  gizliliğini sağlayan koddur,kullanıcı sadece oluşturulan view ile ilgili verilere erişebiliyor,kaynak tablolarla ilgili hiç bir bilgiye ulaşamıyor.

Bu viewlar görüntülenemezler yani şifresiz haline döndüremiyoruz. Bunu yapabilmek için View’in kaynak koduna ihtiyaç duyuyoruz.Bu yüzden Encryption(şifreleme) yapmayı düşündüğümüz View cümlesinin yedeğini kaydetmeyi unutmazsak bizim açımızdan faydalı olacaktır.


View’lerin içeriğini görüntülemenin bir başka yolu da bir stored procedure kullanmaktır. 

sp_helptext ‘ÖrnekViewinİsmi’ 

Stored procedure’e Encryption yaptığımız örneğimiz üzerinde işlem yapmasını söylersek daha önce Encryption yapıldığı için sonuçta bir hata mesajı almamız kaçınılmaz. 

sp_helptext Order_Customer


Encryption var ise görüntüleyemeyiz..

sp_helptext ProductsDetails



Güncelleme için ;
ALTER VIEW yapısınu kullanıyoruz..


SchemaBinding: 

Eğer oluşturacağımız View’de With Schemabinding kullanırsak ya da daha önce oluşturduğumuz bir View’e ALTER View ile With Schemabinding özelliği verirsek bu View’de görmek istediğimiz verilerin tutulduğu tablolardaki veri çektiğimiz sütunları kilitlemiş oluruz.
Bu da demek oluyor ki ;

View’de görüntüleyeceğimiz verilerin bulunduğu tablo ya da tablolardaki sütunların yapısında yapılacak herhangi bir değişikliği bu View’i silmedikçe ya da Schemabinding özelliğini View’imizden kaldırmadıkça yapamayacağız.
-Schemabinding’li View’imizde * kullanamayız. Yani select * from ... diyemeyiz. 

USE NORTHWND
GO

Create VIEW [dbo].[Kategoriler]
With SchemaBinding
AS
SELECT dbo.Categories* 
FROM  dbo.Categories

-Schemabinding kullanıyorsak View’imizin Select cümlesinde referans ettiği tabloların isimleri tablosahibininismi.tabloismi halinde olmalıdır. 

USE NORTHWND
GO

Create VIEW [dbo].[Kategoriler]
With SchemaBinding
AS
SELECT CategoryID,CategoryName,[Description],Picture 
FROM  Categories


With Check Option: 

Sayesinde insert select update yapabiliyoruz.Görünmeyen bir kaydın eklenmesini istemiyorsak with check option yapıyoruz.Diğer bir deyişle where koşulunu muhafaza eder.



DİKKAT: 

Distinct yapısı kullanılmış View’lerin üzerinden Insert, Update ya da Delete gibi işlemler yapamayız. Aynı durum Group By kullandığımız View’ler içinde geçerlidir. 
View kullanarak birden fazla tabloda veri değişikliği yapamayız. 

Şimdi  bu komutların View ile nasıl kullanıldığına dair bir örnek yapalım. 

Önce Musteriler isminde yeni bir View oluşturalım 

View’i kullanıp yeni bir müşteri ekleyelim 

USE [NORTHWND]
GO

Insert Into musteriler Values('jdfh','yuuu','Hacer Doğan','yazılımcı','Kadıköy','Istanbul')

MusteriListele View’ine - With Check Option özelliği verelim 

USE NORTHWND
GO

ALTER VIEW [dbo].[musteriler]
AS
SELECT CustomerID,CompanyName,ContactName,ContactTitle,[Address],City
FROM dbo.Customers
WHERE City ='Aydın'
With Check Option

Şehri İstanbul olan bir kaydı tekrar girmeyi deneyelim 

USE [NORTHWND]
GO

Insert Into musteriler Values('jdfh','yuuu','Hacer Doğan','yazılımcı',
'Kadıköy','Istanbul')


Kategoriler View’inden Schemabinding özelliğini kaldıralım 

USE [NORTHWND]
GO

ALTER VIEW [dbo].[Kategoriler]
AS
SELECT CategoryID,CategoryName,[Description],Picture 
FROM  Categories

Son olarak Kategoriler View’ini silelim 

USE [NORTHWND]
GO


kaynaklar : 
https://mcansozeri.wordpress.com/2011/03/30/mssqlde-view-kullanimi-create-view-alter-view-drop-view/
http://www.yazilimciblog.com/sql-viewler-konusu/
MS-20461 kitabı
Bir de pdf den yararlandım büyük ölçüde fakat linkini bulamadım.Bulduğum zaman ekleyeceğim.

Ayrıca bu siteyide bu konunun özeti şeklinde takip edebilirsiniz:
http://deryagunduz.blogspot.com.tr/2010/07/sqlde-viewsanal-tablo-olusturmak.html


Hiç yorum yok:

Yorum Gönder