5 Mayıs 2012 Cumartesi

MS SQL 'de Views

Merhaba arkadaşlar.
Sql server 'da çok sık kullandığım "select" sorgularım olabilir. Bu çok sık kullandığım "select" sorgularını, kullanmam gereken yerde her defasında uzun uzadıya yazmaktansa, bir kere tanımlayıp, ismiyle birlikte çağırmak daha mantıklıdır. İşte arkadaşlar bunun için "Views" nesneleri oluşturabiliriz. "View", kısaca kaydedilmiş "select" sorgularıdır, "select" dışında bir sorgu kullanılmaz. Özellikler ilişkisel veritabanlarında "join" gibi bir çok tablodan veri çekilirse daha performanslı çalışır. Veriyi hiç bir zaman kendi üzerilerinde taşımazlar, veri tabloda durur ve "select" sorgusunun sonucunu güncel olarak getirir. Veri tabanı nesneleri olduklarından dolayı "DDL" ile manipüle edilirler.

Neden Kullanırız ?
  • Performans:   "Strored Procedure" yada "Function" nesnelerinde nasıl bir performans söz konusuysa "Views" nesneleri için de bu performans geçerlidir. Nasıl bir performanstan bahsediyoruz biraz inceleyelim. Bir sorgu çalışmadan önce 5 aşamadan geçer. Önce kodun yazım hataları, syntax 'ı, semantic 'i kontrol edilir(Parse). Daha sonra sorguda kullanılan tabloların kolonları var mı, ona bakılır(Resolve). Bu ıslemden sonra sorgunun sonucunu nasıl döndüreceğini, indexlemeleri kontrol eder(Optimize). Daha sonra döndüreceği şeklı belirledikten sonra derleme işlemi yapılır(Compile). Son olarak sorgu çalışır ve sonuç döner(Execute). Tanımlanan "View" nesnesi çağırıldığında, "compile" işlemi dahil compile 'dan önceki tüm aşamaları işlemeden geçer. Geriye sadece "execute" işlemi kalır. Bu da önemli bir hız demektir.
  • Güvenlik: Kurum yada departmanlar arası veriye sınırlı erişim yetkileri verilebilir. Bir şirkette her birimin her bilgiyi görmemesi istenir. "View" nesneleri kullanılarak istenilen birimin, istenilen tablodan, istenilen satır ve sütunlara görme yetkisi verilebilir.  Örneğin sekreterimin çalışanlara ulaşabilmesi için onların maaşlarını görmesine gerek yoktur. Aksi takdirde çalışanlar arasında bir çekememezlik meydana gelebilir. Bu genelde genelde raporlamada kullanılır.
NOT"View" nesneleri "Strored Procedure" yada "Function" nesneleri gibi parametre alamazlar. Sadece parametresiz kullanılırlar. Fakat "Strored Procedure" nesnelerinin aksine, "Functions" nesneleri gibi "sub query" olarak sorgu içinde kullanılabilirler.

Bir örnek vererek "view" kullanımını kavrayalım. Yine "Northwind" veri tabanı üzerinde çalışacağız. "Products" tablosundaki "foreign key" sütunlarını daha anlamlı hale getirmek için "CREATE" ddl komutuyla, "UrunKatTed" adında bir "view" oluşturalım. Tipini de "VIEW" olarak belirtiyorum.

USE Northwind
GO
CREATE VIEW UrunKatTed
AS
SELECT p.ProductName,p.UnitsInStock,c.CategoryName,s.CompanyName
FROM dbo.Products p
INNER JOIN dbo.Categories c ON p.CategoryID = c.CategoryID
INNER JOIN dbo.Suppliers s ON p.SupplierID = s.SupplierID
"View" 'ler veri tabanı nesneleridir demiştik. Bu yüzden "object explorer" penceresinde oluşturuldukları veritabanında "Views" sekmesi altında yerini alırlar. "View" nesnem oluştu. Kullanmak istediğimde "FROM" anahtar sözcüğünden sonra istediğim gibi çağırabilirim. Aşağıda görüldüğü gibi istediğim kolon yada "WHERE" anahtar sözcüğüyle istediğim kritere göre filtreleme yapabilirim.
    SELECT * FROM UrunKatTed
    SELECT CategoryNameCompanyName FROM UrunKatTed
    SELECT * FROM  UrunKatTed  WHERE CategoryName='Beverages'
    SELECT ProductName,UnitsInStock FROM UrunKatTed WHERE ProductName>'C' 
ORDER BY 1

Yukarıda oluşturduğum "view" nesnesini "subquery" ile de yapabilirdik. Fakat her defasında yazmak zorunda kalacaktık ve performans kaybı yaşanacaktı. 

NOT Normal kullanımda "view", verilerini tek tablodan alıyorsa, "view" nesnesini kullanırken üzerinde tüm "DML" manipülayonlarını (select, insert, update, delete) yapılabilir. Fakat tanımlanırken verilerini birden fazla tablodan alıyorsa, "null" (boş) geçilemez kolonları doldursam bile "insert, update, delete" işlemlerini yapamam, sadece "select" yapabilirim.

INSERT UrunKatTed(ProductName, UnitsInStock, CategoryName, CompanyName)
VALUES ('Baocha',30,'Kahve','Java')
Hata mesajındaki "multiple base table" ifadesi "view" nesnesinin verilerini birden fazla tablodan çektiğinin göstergesidir. Bu yüzden "insert" işlemi gerçekleştirilememiştir. Başka bir "view" yazalım. Satış yapan çalışanların, satış numaralarıyla birlikte ad ve soyad bilgilerini getirsin. 

CREATE VIEW SipCal
AS
SELECT OrderID,dbo.Employees.FirstName+' '+dbo.Employees.LastName 
/*AS [Ad Soyad]*/
FROM dbo.Orders
INNER JOIN dbo.Employees
ON dbo.Orders.EmployeeID = dbo.Employees.EmployeeID
NOT"View" nesneleri "No Column Name" (isimsiz kolon) hatası verir. Yani tanımlanırken isimsiz kolonlara izin vermez. Çektiğimiz verileri listelerken, sadece gösterimde kendimiz oluşturduğumuz kolonlara isim verilmelidir. "Stored Procedures" ve "Functions" nesneleri için böyle bir kısıtlama yoktur.

CREATE VIEW SipCal
AS
SELECT OrderID,dbo.Employees.FirstName+' '+dbo.Employees.LastName AS [Ad Soyad]
FROM dbo.Orders
INNER JOIN dbo.Employees
ON dbo.Orders.EmployeeID = dbo.Employees.EmployeeID
GO
SELECT * FROM SipCal

Bu "view" 'imizi biraz değiştirelim. Çalışanlara göre, çalışanları yaptığı satış sayısını getirsin. Yine "DDL" komutlarıyla bir değişiklik yapıyorum.

ALTER VIEW SipCal
AS
SELECT COUNT(dbo.Orders.OrderID) AS [Siparis Sayısı],
dbo.Employees.FirstName ' ' dbo.Employees.LastName AS [AD SOYAD]
FROM dbo.Orders
INNER JOIN dbo.Employees
ON dbo.Orders.EmployeeID = dbo.Employees.EmployeeID
GROUP BY dbo.Employees.FirstName ' ' dbo.Employees.LastName

GO
SELECT * FROM SipCal
Daha sonra yine "DDL" komutlarıyla "view" nesnemi silebilirim. 
DROP VIEW sipcal

NOTNormalde "top" deyimi olmadan, "order by" sıralama kriter sözcüğünü kullanabiliyorduk arkadaşlar, "order by" olmadan "top" deyimini kullanamıyorduk. Fakat bir "view" tanımlarken "Order By" tek başına kullanılamaz, ancak ve ancak "top" ile kullanilir. Yani birisini kullanmak istiyorsak, ikisini birlikte kullanmalıyım.
Peki ama ben kayıtlarımın hepsini listelemek istiyorum derseniz, "TOP 100 PERCENT" kullanım şekli kayıtlarınızın 100% 'ünü getirecektir.

CREATE VIEW CalisanTelefon
AS
SELECT TOP 100 PERCENT FirstName,LastName,HomePhone 
FROM dbo.Employees ORDER BY FirstName

GO
SELECT * FROM CalisanTelefon

"View" nesnelerinde "with encryption, with schemabinding, with check option" gibi kontroller oldukça yaygın kullanılır. Ayrıca "View" 'lerde indexleme de yapılabilir. Bu konulara da ilerleyen yazılarımda değinmek dileğiyle, hoşçakalın...

Hiç yorum yok:

Yorum Gönder