1. KONU 6: VIEW
VIEW OBJESİNE GENEL BAKIŞ:
View'lar: Mevcut tablolara bağlı kalarak istenilen bilgileri içerecek, yeni objelerdir. Aynı zamanda sanal
tablo olarak adlandırılır. Veri tabanı içinde var olan tabloların bilgilerini içerir ve genellikle kaydetme yöntemi
kullanılmaz.
Niçin View Kullanırız?
*** Güvenlik nedeni ile view oluşturulur. Bazı tablolardaki bazı sütunların, herkes tarafından görülmesini
istemeyebilirsiniz. Böyle bir durumda istenilen sütunları içeren bir görünüm oluşturup, bu görünüm üzerinde ilgili
kullanıcılara haklar verilir. Bu görünümün referans olarak kullandığı tabloya da, ilgili kullanıcılar için Deny hakkı
verilir. Bu durumda kullanıcı tabloyu görüntüleyemez ama o tabloya bağlı olarak çalışan view'ı görüntüleyebilir.
*** Tablolara girilen veriler üzerinde bazen, sadece fiziksel olarak değişiklik yapma ihtiyacı duyulur veya
tablonun sütunlarında o an yer almayan sütunları; geçici olarak oluşturmak gerekebilir. Bunun için view kullanılır.
*** İki veya daha fazla tabloyu birleştirmek ya da birbirine katmak için kullanılabilir(Union, Join).
*** View tiplerini, Standart, lndexed ve Partitioned olarak üçe ayırabiliriz.
Basit Kullanım Sekli:
CREATEVIEW view_adı
AS
UYGULAMA:
1) Aşağıdaki kod ile "musteriler" tablosundan; sadece mad ve mtel bilgilerini içeren, yeni bir view
oluşturulur.
use gorkem
go
creat view musteriler1
as
select mad,mtel
from musteriler
1) Çalıştırdıktan sonra "görkem" veri tabanı altında bulunan Vievvs klasörü altında oluşturduğumuz View
şekildeki gibi görünür.
2. 3) T-SQL ifadesi ile görmek için aynı tablo gibi SELECT ifadesi kullanılır. Aşağıdaki yazılım View içindeki
kayıtları listeler.
use gorkem
select * from musteriler1
4) Aynı olayı grafiksel olarak tasarlamak için, ilk olarak View nesnesi üzerinde sağ tuşa basılarak New
View seçeneğine tıklanır.
5) Gelen ekrandan tablo adı seçilir. Bizim kullanacağımız tablo müşteriler olduğu için onu seçtik. Ardından
ilk önce Add sonra Close butonuna basılır.
3. 6) Aşağıdaki gibi bir ekran karşımıza gelir. Burada görmek istediğimiz sütunların başındaki kutucuklar
doldurulur. Test etmek amacı ile sağ tuşa basılarak Execute SQL seçeneğine tıklanabilir. Liste en alttaki bölümde
karşımıza gelir. Ortadaki bölüme otomatik olarak T-SQL ifadesi yazılır
7) Son olarak bir isim verilerek kaydedilir.
4. VIEVV TANIMLAMALARI:
View nesnesine genel bir bakış yaptıktan sonra, bu bölümde gelişmiş View'in nasıl oluşturulacağını?
Mevcut olan bir view nesnesinin değiştirilmesini ve silinmesini inceleyeceğiz.
VIEW NASIL OLUŞTURULUR?
İlk kısımda da gördüğümüz gibi SQL Server Management Studio içindeki Object Explorer veya Query
Editör kullanarak oluşturabiliriz.
Gelişmiş kullanım seklini verecek olursak;
CREATE VIEVV [şema ad].view_ad[(sütun(lar)_ad)]
[WITH{ENCRYPTION|SCHEMABINDING|VIEW_METADATA}
AS
Select ifadesi
[WITH CHECK OPTION]
______________________________________________________
View oluşturabilmek için:
*** sysadmin, db_owner, db_ddiadmin rollerinden en az birinin üyesi olmak veya CREATE VIEVV
hakkına sahip olmak gerekir.
*** Ayrıca view içinde kullanılacak tüm tablo ve vievv'lar için, en az SELECT iznine sahip olmak
gerekmektedir.
View oluşumda kullanamayacağımız ifadeler:
*** CREATE VIEVV ifadesinde; COMPUTE veya COMPUTE BY cümlecikleri kullanılamaz. Ayrıca
INTO yardımcı kelimesi olamaz.
*** ORDER BY cümleciği, sadece TOP yardımcı kelimesi varsa kullanılabilir.
*** Geçici tablolara referans olmaz. 32 düzeyden fazla olamaz.
*** 1024 sütundan fazla sütun kullanılmaz.
*** Bir Batch File içinde, diğer Transact-SQL ifadeleri ile birlikte kullanılamaz.
UYGULAMA:
1) Bundan sonraki örneklerde kullanacağımız "satis" isimli bir tabloyu, "görkem" veri tabanı içinde
aşağıdaki şekilde tasarlayalım.
5. 2) İçine aşağıdaki kayıtları girelim.
3) Şimdi aşağıdaki kod ile bu tablodan yararlanarak, yeni bir view oluşturalım. Bu örnek, bugüne kadar
tüm müşterilerin toplam ödedikleri fiyatın üzerine, kdv oranını da ekleyerek gösterir.
use gorkem
go
createview dbo.satisl(musterino, toplamfiyat)
as
select musterino/Sum(convert(money,(fiyat+fiyat*0.15)))
from satis
groupby musterino
4) Oluşturduğumuz view içindeki kayıtları listelediğimiz zaman, görüntü şekildeki gibi olacaktır.
1) Aşağıdaki view ise; kitapların ne kadar geciktiğini, gün bazında gösterir.
use gorkem;
go
createview dbo.satis2
as
select musterino,convert (int,(gelistarihi-alistarihi))as
fark
from satis;
6. 2) Aşağıdaki view; geciken her gün için %4 faiz uygulayarak bu miktarı gösterir.
createview dbo.satis3 as
select musterino,fiyat,
convert(int,(gelistarihi-alistarihi))as fark,
(convert(int,(gelistarihi-alistarihi))*0.04*fiyat)as gecikmebedeli
From satis;
7) View içindeki kayıtlar şekildeki gibi olur.
1) görkem veri tabanı içindeki müşteriler ve satis isimli tabloları birleştirerek mussatl isimli bir view
oluşturalım(Başlamadan önce iki tabloda da hiçbir index olmadığını kabul edelim.).Bu kod
çalıştırıldığında; 1 günden fazla geciken kayıtların, iki tablodan da çeşitli bilgiler alarak, listelendiği
göreceğiz.
use gorkem;
go
createview dbo.mussatl
as
SELECT satis.musterino, mad, mtel, fiyat,
convert(int,gelistarihi-alistarihi) AS gecikengun
FROM satis INNERJOIN
musteriler On satis.musterino = musteriler.musterino
WHERE (gelistarihi-alistarihi > 1) ;
7. 9) Bir önceki işlemi grafiksel olarak yapmak için Views objesi üzerinde sağ tuşa basıp New View
seçeneğine tıklayalım.
10) Gelen ekranda müşteriler ve satis tablosunu seçip, Add butonu ile ekledikten sonra Close butonu ile
kapatalım.
11) satis tablosunda musterino sütunu üzerine Fare'yi getirerek, sol tuşa basıp, musteriler tablosunda
bulunan musterino sütununa doğru sürükleyelim.
8. ,
12) Ardından kutuları aşağıdaki şekilde tasarlayalım. Test için sağ tuşa basarak, Execute SQL ile
çalıştıralım ve kaydederek çıkalım.
9. VIEWLARIN DEĞİŞTİRİLMESİ ve SİLİNMESİ:
View'lar üzerinde yapılacak değişiklik için, SQL Server Management Studio kullanılabileceği gibi, ALTER
VIEW ifadesi ile de oluşturulmuş view'lar üzerinde değişiklik yapılabilir.
Kullanım sekli;
ALTER V1EW owner.view_ad[(sütun(lar)_ad)]
[WITH{ENCRYPTION|SCHEMABINDING|VIEW_METADATA}
AS
Seiect ifadesi
[WITH CHECK OPTION]
Bir view oluşturulduğu zaman sütun bilgileri, syscolumns sistem tablosu içinde tutulur.
select*fromsys.syscolumns
Silmek için ise DROP VIEW ifadesi kullanılır. Silme esnasında view içindeki kayıtlar, birileri tarafından
kullanılıyorsa silme gerçekleşmez. View silinince, bilgilerini aldığı tablolar silinmez. Onların daha sonra, ayrı bir
işlem ile silinmesi gerekir.
UYGULAMA:
1) Daha önce oluşturduğumuz, içinde mad ve mtel sütunlarını barındıran müşterileri nesnesi içine
musterino sütununu ilave ederek, değişiklik gerçekleştireceğiz. Bunun için SQL Server Query
Editör içine aşağıdaki kodu yazıyoruz.
alterview musteriler2
as
select mad, musterino, mtel
from musteriler
10. 2) View içindeki görüntü, şekildeki gibi olacaktır.
2) Aşağıdaki kod ile daha önce oluşturduğumuz "satis3" isimli view nesnesini siliyoruz
use gorkem
dropview satis3
İZİNLER:
Bir view'ın başkaları tarafından kullanılması için GRANT ile gerekli izinlerin verilmesi gerekir.
UYGULAMA:
1) görkem altındaki Users kısmına kazim isimli bir kullanıcıyı, bu veri tabanına daha önce eklemiştik.
2) kazim isimli kullanıcı ile SQL Server'a girdiğimiz zaman, bu konuda oluşturduğumuz hiçbir view"da
değişiklik yapamayacağız. Bunu test etmek için müşterileri view'ında bir kayıtta değişiklik yapmaya çalışalım.
3) Şimdi "kazim" isimli kullanıcıya bu view'da değişiklik yapabilmesi için yetki verelim. Bunun için SQL
Server'a tekrar "sa" isimli kullanıcı ile logon olalım.
4)Şimdi bu kullanıcı için müşterileri nesnesine yetki verelim.
use gorkem
go
grantupdateon musteriler1 to kazim
5) Tekrar "kazim" isimli kullanıcı ile SQL Server'a girelim ve artık müşterileri tablosunun içindeki kayıtları
açalım ve değişiklik yapalım. İşimiz bittikten sonra tekrar "sa" kullanıcısı ile bağlanalım.
3) Aşağıdaki kod, bir view için oluşum kodlarını listeler.
sp_helptext musteriler2
11. 4) Bir view nesnesinin kullandığı nesneleri listelemek için, sp_depends system store procedure'ü
kullanılır.
sp_depends musteriler2
VIEW TANIMLAMALARININ GİZLENMESİ:
Kullanıcılar SQL Server Management Studio, syscomments sistem tablosunu veya INFORMATION.
SCHEMA.VIEVVS kullanarak, bir view oluşum yapısını görebilirler. Bunu önlemek için; WITH ENCRYPTION
ifadesi ile view nesneleri oluşturulur. Bu işlem yapıldıktan sonra view silinip, yeniden oluşturulmadığı takdirde
veya ALTER VIEW kullanılarak orijinal hale dönüştürülmediği sürece, view nesnesine ait oluşum bilgileri
edinemeyiz.
UYGULAMA:
1) "musteriguven" isimli yeni bir view nesnesini, tanımlamalarını gizlemek amacı ile aşağıdaki şekilde
oluşturuyoruz. Bu yapı ile aynı zamanda, oluşturulan bir view için Design kısmına da girilerek değişiklik
yapılmasını engellemiş olacağız. Bu yapı, view nesnesinin içinde oluşan kayıtların görüntülenmesiniengellemez.
Sadece içinde değişiklik yapılmayı ve oluşturulan kodların görünmesini engeller.
use gorkem
go
createview dbo.musteriguven
withencryptionas
select mad,mtel from musteriler
2) Kodu çalıştırdıktan sonra, SQL Server Management Studıo'yu kullanarak Object Explorer kısmında
"musteriguven" üzerinde sağ tuşa basınca Design seçeneği aktif olmadığını görürüz.
12. Ayrıca aşağıdaki kodu yazarsak da içeriğini göremeyiz. Sadece içindeki kayıtlara erişebiliriz.
VIEW İÇİNDEKİ VERİLERİN DEĞİŞTİRİLMESİ:
Oluşturulan bir view içinde bulunan veriler; ana tablo veya tabloların bir kopyası değildir. Bundan dolayı
view içinde bulunan bir veriyi değiştirdiğimiz zaman ana tablodaki veri, değişikliğe uğrar. Bazı kısıtlamalar
olmasına rağmen, bir view içinde bulunan veriler silinebilir, güncellenebilir veya yeni bir veri eklenebilir. Bu
işlemler için genellikle View tek bir tablodan üretilmeli, içinde fonksiyonlar ve GROUP BY cümleciğinin olmaması
gerekir.
UYGULAMA:
1) Müşteriler2 isimli view nesnesini açıp, aşağıdaki kayıdı içine girelim.
Sazan 107 8888888888
2) müşteriler tablosunu açtığımızda görüntü, aşağıdaki gibi olacaktır. Dikkat edilirse 107 no'lu kaydın, ana
tabloya diğer bilgilerle beraber eklendiği görülür. Bu işlem değişiklikler ve silmeler için de geçerlidir.
3) müşterileri nesnesini açarak 107 no'lu kaydı tamamen silelim ve tekrar müşteriler tablosunu
açtığımızda bu kaydın silinmiş olduğunu, gözlemleyelim.
Bu yapı için uygulanacak kuralları listeleyecek olursak;
*** Birden fazla tabloda oluşan view'lardaki değişiklik, aynı anda tüm tabloya etki etmez. Her değişiklik;
sadece parçayı oluşturan tablolara, ayrı ayrı etki eder.
*** Bir hesaplama sonucu oluşmuş sütunlar üzerinde değişiklik yapılmaz. Örneğin; view üzerinde
"giriştarihi" ve "çıkıştarihi" isimli iki sütunun farkından oluşan; bir fark sütunu bulunuyorsa, bu sütuna değer
girilemez.
*** View'ı oluşturan tablolarda bir sütunu boş geçme izini yoksa ve sizin girdiğiniz değer o tabloya etki
ediyorsa, bu kayıt girilemez. Ana tablodan boş geçilemez ibaresini iptal etmek, yani Allow Null seçeneğini
işaretlemek gerekir.
*** WITH CHECK OPTION ile view yapısına girilen kayıtlar kontrol ettirilebilir. Bu, view'ı kullanacak diğer
vievv'lar için bir sınırlama
3) müşterileri nesnesini açarak 107 no'lu kaydı tamamen silelim ve tekrar müşteriler tablosunu
açtığımızda bu kaydın silinmiş olduğunu, gözlemleyelim.
Bu yapı için uygulanacak kuralları listeleyecek olursak;
13. *** Birden fazla tabloda oluşan view'lardaki değişiklik, aynı anda tüm tabloya etki etmez. Her değişiklik;
sadece parçayı oluşturan tablolara, ayrı ayrı etki eder.
*** Bir hesaplama sonucu oluşmuş sütunlar üzerinde değişiklik yapılmaz. Örneğin; view üzerinde
"giriştarihi" ve "çıkıştarihi" isimli iki sütunun farkından oluşan; bir fark sütunu bulunuyorsa, bu sütuna değer
girilemez.
*** View'ı oluşturan tablolarda bir sütunu boş geçme izini yoksa ve sizin girdiğiniz değer o tabloya etki
ediyorsa, bu kayıt girilemez. Ana tablodan boş geçilemez ibaresini iptal etmek, yani Allow Null seçeneğini
işaretlemek gerekir.
*** WITH CHECK OPTION ile view yapısına girilen kayıtlar kontrol ettirilebilir. Bu, view'ı kullanacak diğer
vievv'lar için bir sınırlama
BİR VIEW KULLANARAK BAŞKA BİR VİEW OLUŞTURULMASI:
Çok fazla karmaşık ifadeleri kullanarak bir view oluşturmak yerine, kademe kademe gidilerek oluşturulan
vievv'lardan; yeni vievv'lar oluşturup, karmaşık yapıları basitleştirebiliriz.
UYGULAMA:
1) Aşağıdaki örnek, daha önce oluşturduğumuz müşterileri isimli View'ı kullanarak turkcell isimli
yeni bir vievv oluşturacaktır. Ancak sadece 532 ile başlayan telefonları gösterecektir
.
use gorkem
go
createview turkcell
as
select*
from
musteriler2
where mtel like'532%'
2) İçini açtığımızda sadece 0532 ile başlayan kayıtlar, şekildeki gibi görüntülenir.
VIEW YAPISINDA INDEX KULLANIMI:
Bir Vievv oluşturduktan sonra aynen tablolar gibi, index özelliği
kazandırılabilir. Index oluşturmanın amacı: Daha önce de uzun uzun belirttiğimiz gibi, sorgulama
performansını arttırmak içindir.
Dikkat edilecek noktalar: ,,
*** Vievv üzerinde oluşturulacak ilk index Unique ve Clustered olmalıdır.
*** Vievv oluştururken SCHEMABINDING seçeneği kullanılmalıdır.
Bağlı bulunduğu tabloya referans olurken, diğer vievv'lara referans olmaz.
View içinde index oluşturmak için, SOL Server Management Studio
kullanılabilir.
Bunun için:
14. 1) lndex kazandırılacak Vievv'ın başındaki artı açılarak altında lndexes klasörü üzerinde sağ tuşa
basılarak New lndex seçeneğine tıklanır.
2) Gelen şekildeki ekranda Add butonuna basarak açılan listeden hangi sütun veya sütunlara
index kazandırılacak ise o seçilir ve OK butonuna basılır. Index name kısmına isim girilerek onaylanır.