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