13 Nisan 2011 Çarşamba

SQL View ile Update İşlemi

Bir önceki yazıda view’lerin yapısından bahsetmiştik. Şimdi de view üzerinden update işleminin nasıl yapıldığını inceleyeceğiz.

View’lar data tutmazlar. Dolayısı ile view’ler üzerinden yapacağımız bu işlemler, view içerisinde sorgulanan tabloyu direkt olarak etkiler. View' üzerinden update yapabilmemiz için, bu işlemin tek bir tabloyu etkilemesi gerekir. Birden fazla tabloyu etkileyecek bir durum olursa  hata alırız.

İlk olarak AdventureWorks veritabanında, Fiyatı 0 olan ürünleri gösteren bir view yazalım.

CREATE VIEW VW_BedavaUrunler

AS

      SELECT * FROM Production.Product

      WHERE ListPrice=0

 

--Sonuçları görmek için

SELECT * FROM VW_BedavaUrunler

Sonuçlar aşağıdaki gibi olacaktır.

Untitled

Sayfanın sağ altında gördüğümüz gibi, view’a select attığımızda 200 satırlık bir sonuç elde ettik. Şimdi ProductID’si 1,2,3 ve 4 olan ürünlerin fiyatlarını update ederek 100 yapalım.

UPDATE VW_BedavaUrunler SET ListPrice=100 WHERE ProductID IN (1,2,3,4)

 

Bu komutu çalıştırdığımızda aşağıdaki mesajı göreceğiz.

Untitled2

İstediğimiz gibi ID’si 1,2,3 ve 4 olan ürünlerin fiyatlarını 100 olarak update ettik. Bu update işlemi aslında direk Production.Product tablosu üzerinde gerçekleşti.

Şimdi önemli bir noktaya değinelim. Yazdığımız view, Fiyatları 0 olan ürünleri getirmemizi sağlıyordu ve update işleminden önce sorgu sonucundan 200 satır elde etmiştik. Şimdi 4 ürünün fiyatını update ederek 100 yaptık. Yani artık bu ürünlerin fiyatları 0 olmadığından dolayı, bu view’a tekrar select attığımızda 196 satır elde edeceğiz.

Untitled3

Şimdi de view ‘daki data çıkışını engellemek için bir çözüm üretelim. Yani, yapacağımız update işlemi, view’ın satır sayısını değiştiremesin. Yukarıdaki örnek için konuşacak olursak, ‘VW_BedavaUrunler’ üzerinden bir ürünün fiyatını değiştirememeliyiz. Çünkü yazdığımız view zaten fiyatı 0 olan ürünleri getirmekte. Dolayısı ile fiyat kolonunda değişiklik yapmamız, bu view’ın sorgu sonucunda elde ettiğimiz bir datanın kaybolmasına neden olacaktır. Bunu engellemek adına view’ı aşağıdaki gibi değiştirelim.

ALTER VIEW VW_BedavaUrunler

AS

      SELECT * FROM Production.Product

      WHERE ListPrice=0

      WITH CHECK OPTION

Ardından, fiyatlarını 100 olarak update ettiğimiz ürünleri, Production.Product tablosu üzerinden, fiyatları yeniden 0 olacak şekilde updade edelim,

UPDATE Production.Product SET ListPrice=0 WHERE ProductID IN (1,2,3,4)

Bu son haliyle view üzerinden select attığımız zaman 200 satır elde etmiş durumdayız. Şimdi view üzerinden ilk kısımda yaptığımız update işlemini tekrar deneyelim.

UPDATE VW_BedavaUrunler SET ListPrice=100 WHERE ProductID IN (1,2,3,4)

İşte bu hali ile, yukarıdaki update çalışmayacaktır. Çünkü bu ürünlerin fiyatlarını 100 olarak değiştirmemiz demek, view’dan data çıkışı olması anlamına gelir. ‘WITH CHECK OPTION’ diyerek bunu engelledik. Aldığımız hata mesajı aşağıdaki gibi olacaktır.

Msg 550, Level 16, State 1, Line 1

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.

The statement has been terminated.



0 yorum:

Yorum Gönder