VİEW (SANAL TABLO) 1. View Nedir? View`ler, sorguları

advertisement
VİEW (SANAL TABLO)
1. View Nedir?
View’ler, sorguları basitleştirmek, erişim izinlerini düzenlemek, farklı sunuculardaki
eşdeğer verileri karşılaştırmak veya bazı durumlarda sorgu süresini kısaltmak için kullanılan,
gerçekte olmayan, SELECT ifadeleriyle tanımlanmış sanal tablolardır.
SQL işleminde birden fazla tablo ve onların farklı farklı kolonları kullanılacaksa,
hepsini birleştirmek, gerekli tablodan sorgu yapmak biraz zahmetli bir iş olabilir. Bunun
yerine view denen sanal tablolardan oluşturup, gerekli kolonları farklı tablolardan alıp
sorguları tek bir tablo üzerinden yapmak işleri kolaylaştırabilir. Karmaşık sorgular kolay bir
hale gelmiş olur. Ayrıca view kullanmanın çok önemli nedenlerinden bir tanesi sağladığı
güveliklerdir. Tabloların tamamının görünmesi istenilmediği zamanlarda sanal tablo kullanıp
görünmesini engelleyebilirsiniz.
View’ler üzerinde yapılan değişikler, kendilerini oluşturan kaynak tabloları da etkiler,
aynı değişiklikler kaynak tablolara da yansır. Çeşitli kısıtlar altında yeni kayıt eklenebilir,
kayıt silinebilir, güncelleme yapılabilir.
2. View’ler ile Çalışmak
View’ler kaydedilmiş sorgulardan ibarettir. Aslında tablo gibi kullanılsa da böyle bir
tablo gerçekte yoktur. Ancak view’ler, SELECT …… FROM ‘dan sonra adı verilerek bir
tabloymuş gibi sorgulanabilir.
Bir view’in verileri çektiği gerçek tabloya temel tablo (base table) denir. Bir view
temel tablonun bütün sütunlarını veya bazı sütunlarını veya bazı satırlarını kapsayabileceği
gibi bazen birden fazla temel tablo üzerinde tanımlanmış bir view de olabilir. Bunun yanı sıra
SQL Server’de view’lerin tablolara dayalı olması da zorunluluk değildir. View, başka bir
view üzerine de tanımlanabilir.
3. View Oluşturmanın Yararları
 Veri güvenliği;
Veri tabanı içinde bulunan tablolardaki bazı sütunlarda veya satırlarda bulunan
bilgilerin, herkes tarafından görülmesi istenmeyebilir.
Örneğin, personelin maaşlarının herkes tarafından listelenebilir olması mahsurlu
olabilir. Bu durumda, Personel adlı temel (base) tablodan, vw_pers adlı bir view
oluşturulabilir. Bu view’e maaş sütunu dâhil edilmez. Vw_pers adlı view, herkesin
kullanımına açık, Personel adlı tablo ise, yetkili kişiler dışındakilere erişilemez hale
getirilirse, maaşların herkes tarafından erişilebilir bilgi olması önlenmiş olur.
 Birim dönüştürmeleri;
Kullanıcıların çeşitli birim dönüşümlerinden geçmiş değerler görmesi gerektiğinde
view kullanılabilir.
Örneğin satışı yapılan ürünlerin saklandığı tabloda uzunluk ile ilgili bir sütun
olduğunu varsayalım. Bu sütunun bazı kullanıcılar için inch cinsinden bazı kullanıcılar için
cm cinsinden görünmesini istendiğinde farklı view’ler kullanılabilir.
 Verilerin farklı bir tablo formatında sunulması;
Bazı durumlarda normalizasyon ile tasarladığımız tablolar çok karışık olabilir.
Kullanıcıların tabloları daha basit bir formatta görmesi gerektiğinde, birden fazla temel
tablodan oluşan bir view işe yarayacaktır.
 Çok karmaşık sorguları basitleştirmek;
Karmaşık sorgulamalar, VIEW özelliği kullanılarak daha basit hale getirilebilir.
Örneğin; karmaşık SELECT komutu içinde, sonucu kullanılacak başka bir SELECT komutu
kullanmak yerine, bu sonucu bir view olarak isimlendirerek, view adını kullanmak işi
basitleştirebilir. Bazı durumlarda ise, işletmenin veri tabanı uygulamasında çok sık olarak
sorulan karmaşık soruları bir view yapısı içinde saklayarak, daha sonra aynı tip sorgulamalar
için bu view yapısını kullanarak daha basit ifadeler kullanmakta olasıdır.
4. View’ler nasıl oluşturulur?
Genel olarak bir view en basit şekilde aşağıdaki gibi oluşturulur;
CREATE VIEW viewAdi
AS
SELECT sütun_adlari FROM tabloAdi
View adlarının vw_ ile başlaması tavsiye olunur, böylece veri tabanınıza yeni bakan
biri onun bir view olduğunu kolayca anlayabilir.
View’lerde sütun adlar, özellikle belirtilmediği sürece temel tablodaki sütun adları ile
aynı olur. Yine view’lerde sütunların veri tipi belirtilmez, çünkü SELECT ifadesini takip eden
sütunların tipi ile aynıdır.
View tanımındaki SELECT ifadesi, ORDER BY, COMPUTE ve COMPUTE BY yan
cümlelerini almazlar.
5. View’leri Yönetmek
5.1. View Üstünde Değişiklik Yapmak
Bir view üzerinde değişiklik yapmak için ALTER deyimi aşağıdaki şeklide kullanılır.
ALTER VIEW viewAdi
WITH secenekler
AS
SELECT sütun_adlari FROM tabloAdi
5.2. Tanımlı view’leri görmek ve sistem view’leri
Bir veritabanında hangi view’lerin tanımlanmış olduğu görülmek istendiğinde
genellikle sistem view’lerinden yararlanılır. Sistem view veya şemaları master veritabanında
bulunur ve ANSI standartlarında tanımlanmış olduğundan birçok diğer VTYS’de aynı isimle
bulunabilir.
Sistem Şeması
İşlevi
information_schema.tables
Veritabanında tanımlı view’lerin bir listesini içerir. Temel
tablo olarak sysobjects ’i kullanır.
Hangi tablolar üzerinde view tanımlı olduğunu gösterir.
sysdepends tablosunu kullanır.
Tanımlı view’lerin adı ve kaynak kodu gibi özelliklerini
tutar. syscomments ve sysobjects’ten veri çeker.
information_schema.view_table_usage
information_schema.views
Tablo 1. View’ler hakkında bilgi içeren sistem şemalarından bazıları
Bütün view’lerin kaynak kodunu görmek için;
SELECT * FROM INFORMATİON_SCHEMA.VIEWS
Herhangi bir view’in syscomments tablosunda yer alan tanımını okuyabilmek için;
SP_HELPTEXT ‘view_ismi’
View’lerin listesini almak için;
SELECT * FROM sys.views
5.3. View’leri Silmek
View’leri silmek için şu komut kullanılır.
DROP VIEW viewAdi
5.4. View Tanımlarını Gizlemek
Bazı durumlarda, view’leri oluşturan kaynak kodlarımızın başkaları tarafından
görülmesini istemeyiz. Bu durumlarda, SQL Server kaynak kodları şifreleyebilir. Ancak
şifrelenmiş bir view’in kaynak koduna biz de dâhil hiç kimsenin ulaşamayacağını gözden
kaçırmamak lazım. Bu nedenle şifrelemeden önce bir kopyasını kaydederek doğacak
aksaklıkların önüne geçebiliriz.
View’leri şifrelemek için ENCYRIPTION operatörü kullanılır. Bir view, ilk
oluşturulma anında şifrelenebileceği gibi daha sonradan da şifreli hale getirilebilir.
Kaynak kodu şifrelenmiş bir view oluşturmak için;
CREATE VIEW viewAdi
WITH ENCRYPTION
AS
SELECT sütun_adlari FROM tabloAdi
5.5. Temel Tabloların Şemasını Kilitlemek: SCHEMABINDING
SCHEMABINDING operatörünün görevi, view’e ait temel tabloların şemalarında
değişiklik yapılmayacağına dair bir kilitleme yapmaktır. Bu operatör view’in tanımında
olduğu sürece, view’e ait temel tablolar üzerinde bir sütun silinemez veya türü değiştirilemez.
Şemada bir değişiklik yapabilmek için, ya SCHEMABINDING seçeneğinin tanımdan
çıkarılması ya da view’in tamamen silinmesi gereklidir.
Bir view üzerinde, Unique Clustered Index tanımlayabilmek için view’in
SCHEMABINDING ile tanımlanmış olması gereklidir.
SCHEMABINDING seçeneğinin seçili olabilmesi için view’in tanımında yer alan
temel tabloların isimlerinin sahip.tabloadı şeklinde yazılmış olması gerekmektedir.
CREATE VIEW vw_CokUgrastim
WITH SCHEMABINDING -- tablolarda bir değişiklik yapılamıyor
AS
SELECT ad, soyad, sehir
FROM dbo.musteri
-- dbo. Olmalı (tablonun sahibi)
DROP TABLE musteri --yazıldığında hata verir
HATA: Could not drop object 'musteri' because it is referenced by a FOREIGN KEY
constraint.
5.6. View’ler ve INSERT, UPDATE, DELETE ifadeleri
Bir view gerçekte bir tablo olmasa da veri seçmenin yanı sıra veri güncelleme, silme
ve ekleme amaçlı da kullanılabilir. View’ler bünyesinde veri tutmadıklarından ilgili
değişiklikleri doğrudan temel tablo üzerinde gerçekleştirirler.
View’ler gerçek bir tablo olmadığından dolayı, veri değişikliği yapılırken bazı
kısıtlamalar vardır. Bunlar;
 Bir view aynı anda sadece tek bir tablo üzerinde veri değiştirebilir. Birden fazla
tablodan kayıt çeken view’ler üzerinde veri değişikliği yapılacaksa, aynı anda tek bir
tablo etkilenecek şekilde parçalara ayrılmalıdır.
 Bir view’in temel tablosu üzerinde değişiklik yapılabilmesi için, Constraint ve
Indeks’lere takılmaması gerekir. Temel tablomuzda NULL olamayan sütunlar varsa ve
bu sütunlar view’de yer almıyorsa veri ekleme işleminde hata meydana gelecektir.
 WHERE ifadesi ile filtrelenmiş bir view’de UPDATE cümleciği ile filtre dışına çıkma
olasılığı vardır. Aynı şekilde bir view’in seçemeyeceği bir kaydın eklenmesi olasılığı
da vardır. Bu türden bir durumunu önüne geçebilmek için view’in CHECK OPTION
operatörü ile oluşturulması gerekir. CHECK OPTION, verilerin güvenliği açısından da
koruma sağlayacaktır. Böylece WHERE koşulu muhafaza edilmiş olur ve WHERE
koşulu dışındaki INSERT ve UPDATE işlemleri yapılmaz, hata verir.
CREATE VIEW vw_ilk_harfi_A_olan_musteriler
AS
SELECT adi,soyadi
FROM musteri
WHERE adi LIKE 'a%'
WITH CHECK OPTION
Yukarıda oluşturulan vw_ilk_harfi_A_olan_musteriler isimli view’e aşağıdaki eklenme
yapılmak istendiğinde hata verir.
INSERT INTO vw_ilk_harfi_A_ile_baslayan_musteriler
VALUES ('Fatma' , 'Kılınç’)
HATA: The attempted insert or update failed because the target view either specifies
WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or
more rows resulting from the operation did not qualify under the CHECK OPTION
constraint.
(with check option ‘dan dolayı 'a' ile başlamayan bir ekleme yapılamaz)
6. Parçalı View Yapıları
Parçalı view’ler birden fazla eş tablodan veri çekip bir tabloymuş gibi gösteren
view’lerdir. Örneğin birden fazla şubesi olan bir mağazanın farklı şubelerinden birinde SQL
Server, diğerinde Access, bir diğerinde Oracle gibi farklı veri tabanları kullanılabilir.
Bunlarda yer alan satış verilerini bir araya getirip incelemek istendiğinde, parçalı view’ler
etkin bir çözümdür.
Bir diğer kullanım alanı ise, çok fazla miktarda veri içeren tabloları yataylaştırmaktır.
Örneğin 30 milyon abonesi olan bir telefon şirketini ele alalım. Tek bir tabloda 30 milyon
kaydı saklarken diske sığmama, raporlama işlemlerinin yavaş yapılması gibi problemler
yaşanıyorsa alan koduna göre farklı tablolara ayrılabilir. Böylece tablo sayısı artacaktır ama
her tablodaki kayıt sayısı azalacaktır.
Parçalı View oluşturmak için aşağıdaki genel ifade kullanılır.
CREATE VIEW view_adi
WITH secenekler
AS
SELECT …….
UNION ALL
SELECT ……
Örnek: İki veya daha fazla şubede çalışmak üzere, sipariş takip sistemi geliştirdiğimizi
varsayalım. Urun tablosu aşağıdaki gibi olsun.
CREATE TABLE sube1urun (
Subekod INT NOT NULL
Urunkod INT,
Urunad VARCHAR(50),
PRIMARY KEY ( SubeKod, Urunkod )
CHECK (Subekod = 1 )
)
CREATE TABLE sube2urun (
Subekod INT NOT NULL
Urunkod INT,
Urunad VARCHAR(50),
PRIMARY KEY ( SubeKod, Urunkod )
CHECK (Subekod = 2 )
)
INSERT INTO sube1Urun ( Subekod, Urunkod, Urunad )
VALUES (1,1,’Staj Defteri’)
INSERT INTO sube1Urun ( Subekod, Urunkod, Urunad )
VALUES (1,2,’Elbise Askısı’)
INSERT INTO sube2Urun ( Subekod, Urunkod, Urunad )
VALUES (2,1,’Staj Defteri’)
INSERT INTO sube2Urun ( Subekod, Urunkod, Urunad )
VALUES (2,3,’Kravat’)
Merkez ofiste, Genel Müdürün bütün şubelerdeki ürünlere göz atabilmesi için, bir
parçalı view oluşturalım.
CREATE VIEW pw_merkez_sube
AS
SELECT * FROM sube1urun
UNION ALL
SELECT * FROM sube2urun
Bu view’in neleri kapsadığını görmek için,
SELECT * FROM pw_merkezsube
Daha sonra, view üzerinden üç yeni ürün ekleyelim.
INSERT INTO pw_merkez_sube ( Subekod,
VALUES (1,4,’Pergel Takımı’)
Urun, Urunad )
INSERT INTO pw_merkez_sube ( Subekod,
VALUES (2,4,’Pergel Takımı’)
Urun, Urunad )
INSERT INTO pw_merkez_sube ( Subekod,
VALUES (2,5,’Kıl Testere’)
Urun, Urunad )
Daha sonra her iki tablodaki kayıtları kontrol edelim.
SELECT * FROM sube1Urun
SELECT * FROM sube2Urun
İlk kaydın birinci tabloya, diğer iki kaydın ikinci tabloya eklendiğini görürüz. Burada
subekod sütununa parçalayıcı sütun adı verilir. Bu sütunu SQL Server açısından parçalayıcı
sütun yapan şey, üstünde tanımlı olan CHECK constraint’tir.
7. Nesnelere Takma İsimler Vermek ( Synonymus )
Bir nesneye kalıcı olarak başka bir isim ile veritabanı seviyesinde isimlendirmek
gerekirse SYNONYM lerden yararlanılabilir. Synonym oluşturmak için için aşağıdaki genel
ifade kullanılır.
CREATE SYNONYM synonym_ismi
FOR nesne
Download