--------------------------------- View -----------------------------
--Sanal Tablolardır.
--(İndexed viewleri hariç kendi verileri yoktur.)
--Raporlama araçlarında sık kullanılır.
--eğer sadece sql değilde visiual studio da çalışıyorsak view yerine (TypedDateSet)kullanabiliriz.
--Viewlerde sadece select kullanabiliriz. Ondan sonra ancak insert, uodate, delete yapabiliriz.
-- Bana 09 ağustos çikolatanın indirimi %10 ' a çıkacak eğer parasını ödemişler varsa bu farkı bonus olarak kartlara verin.
--OBJELER CREATE İLE OLUŞTURULURU. VİEW DE BİR OBJEDİR.
create view vw_UrunleriveKategorileriGetir
as
select c.CategoryName, p.ProductName
from Products p
join Categories c on c.CategoryID=p.CategoryID
--eğer view tablo ise select ile çağırabiliriz.
select * from vw_UrunleriveKategorileriGetir
--çalışanların adlarını ve soyadlarını ek kolon halinde getirecek şekilde ve yaşlaını da getiren bir view
create view vw_Calisanlar
as
select Firstname +' '+ LastName 'Ad ve Soyad', DATEDIFF(YYYY,BirthDate,GETDATE())'Yas'
from Employees
select * from vw_Calisanlar
--Hangi çalışan(Çalışanın adı ve soyadı) hangi müşeriden(şirketin adı) hangi tarihte(Order Date)sipariş almıştır.
create view vw_Siparis
as
select e.FirstName +' '+ e.LastName as Calisan,
c.CompanyName as Müsteri,
o.OrderDate as Tarih
from Employees e
join orders o on o.EmployeeID=e.EmployeeID
join Customers c on c.CustomerID=o.CustomerID
select * from vw_Siparis
--vw_Siparis viewı üzerinde Müşteri değeri 'Vins et alcools Chevalier' olan ve tarih değeri '1996-07-04 00:00:00.000' olan kadın çalışan kolonunu çağlar temur yapın.
--Kural-1
--birden fazla (FirstName ve LastName) kolonu birleştirdiğiniz zaman değiştirme yapılmaz. Ama eğer tek kolondan gelsydi update olurdu.
update vw_Siparis set Calisan='Çağlar Temur'
where Müsteri='Vins et alcools Chevalier' and Tarih='1996-07-04 00:00:00.000'
--hata satırı
--Update or insert of view or function 'vw_Siparis' failed because it contains a derived or constant field.
--vw_Siparis Calisan değeri Nancy Davolio olan kayıtların müsteri değer, çağlar ve tarihi 11.11.2011 yapın
--Kural-2
--instead of trigger kullanmadığınız sürece view üzerinde birden fazla tabloyu etkileyecek işlem yapamazsınız.
update vw_Siparis set Müsteri='çağlar', Tarih='11.11.2011'
where Calisan='Nancy Davolio'
--hata satırı
--View or function 'vw_Siparis' is not updatable because the modification affects multiple base tables.
--sadece müsteri kolonunu güncelleyecelim.
update vw_Siparis set Müsteri='Caglar LTD' where Calisan='Nancy Davolio'
--yorum satırı (65 row(s) affected) 65 satır etkilendi.
-- vw_Siparis view üzerinde irden fazla kaynak tabloda güncelleme yapmak için
--1) instead of trigger yazılır
create trigger tg_GuncellemeYap
on vw_Siparis
instead of update
as
declare @eskiCalisan varchar(31), @eskiMusteri varchar(40), @eskiTarih datetime
declare @yeniCalisan varchar(31), @yeniMusteri varchar(40), @yeniTarih datetime
select @eskiCalisan=Calisan, @eskiMusteri=Müsteri, @eskiTarih=Tarih from deleted
select @yeniCalisan=Calisan, @yeniMusteri=Müsteri, @yeniTarih=Tarih from inserted
-- ÖDEV Çalışan gücellemesi bize ait
update Customers set CompanyName=@yeniMusteri
where CompanyName=@eskiMusteri
update Orders set OrderDate=@yeniTarih
where OrderDate=@eskiTarih and CustomerID in --inin yazılma sebebi eğer öğre () içindeki kümeden biri ise
(
select CustomerID from Customers
where CompanyName=@yeniMusteri
)
--viewda birden fazla kaynak tablouyu etkileceyecek update
update vw_Siparis
set Müsteri='Hasan LTD', Tarih='11.11.2011'
where Calisan like '%Nanc%'