8.hafta yusuf dinçer

14
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: CREATE VIEW 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.

Upload: oktay-goekgoel

Post on 07-Jul-2015

97 views

Category:

Career


5 download

TRANSCRIPT

Page 1: 8.hafta yusuf dinçer

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:

CREATE VIEW 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.

Page 2: 8.hafta yusuf dinçer

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.

Page 3: 8.hafta yusuf dinçer

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.

Page 4: 8.hafta yusuf dinçer

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.

Page 5: 8.hafta yusuf dinçer

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;

Page 6: 8.hafta yusuf dinçer

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) ;

Page 7: 8.hafta yusuf dinçer

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.

Page 8: 8.hafta yusuf dinçer

,

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.

Page 9: 8.hafta yusuf dinçer

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

Page 10: 8.hafta yusuf dinçer

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

Page 11: 8.hafta yusuf dinçer

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.

Page 12: 8.hafta yusuf dinçer

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;

Page 13: 8.hafta yusuf dinçer

*** 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:

Page 14: 8.hafta yusuf dinçer

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.