-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQL(TriggerMyNote).sql
78 lines (53 loc) · 5.06 KB
/
SQL(TriggerMyNote).sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*Triger kullanıyorum çünkü ; Yapmak istediğim şey ; Bir kullanıcı sipariş verdiğinde otomatik olarak siparişteki ürünün adedi kadar Ürün tablosundan ürünnün stok miktarı nın otomatik olarak azalmasını istiyorum */
/*Create Triger yazıp triggerrimizi yaratıyoruz sonra "trg_" dedikten sonra trigger ismini giriyoruz "on" yazıp hangi tablodan işlem yapacaksak onu veriyoruz */
/*Ardından DDL konusu olan insert "after insert" yani insertden sonra ne olacak*/
Create Trigger trg_InserOrder on [Order Details]
After Insert--hangi işlemi tapacağımızı belirtir--
AS
/*Declare sql de değişken tanımlarken kullandığımız bir komuttur. Değişken tanımlamızın sebebi kullanıcının verdiği sipariş hangi ürün (ürünü Id[Primary Key]'lerinden buluyoruz ürünü ) */
/*@kaçadet değişkeni ise kullanıcının alacağı ürününden nekadar alacağını yakalamamızı sağlıyor */
Declare @hangiUrunId int , @kaçAdet int
/* Trigger çaşlıştığında arkaplanda geçici bir sanal tablo oluşturur.Burdaki "İnserted Sanal" tablosudur.
Sanal Trigger Insert tablosundan yani trigger insert işlemi yaptığımız da oluşan sanal taplodan ProductId ye denk düşen ürünün stok miktarını alacaksın diyorum */
select @hangiUrunId = ProductID , @kaçAdet = Quantity from inserted
/*En sonunda güncelenecek tablonun(Products) stok miktarını (UnitInStok)'u kulanıcının girdiği
aded'den (@kaçAdet) çıkartır.
where'lede products tablosundaki tüm sutunları değişmesinin engelleyip sadece kullanıcının
sipariş veridiği ürünü yakalasın diye ProductID 'yı kullanıcının verdiği (@hangiUrunId)'yi eşiteyerek
sadece kullanıcının istediği ürüne müdahele ederiz*/
Update Products
SET UnitsInStock = UnitsInStock - @kaçAdet
WHERE ProductID = @hangiUrunId
--Trigger (Tetikleyiciler)
--Bir tablo üzerinde insert, update ve delete işlemlerinden biri yapıldıktan sonra otomatik olarak devreye girmesini istediğimiz işlemleri trigger kullanarak yerine getirebiliriz. BU işlemler esnasında bize yardım olacak 2 tane sanal tablo bulunmaktadır. Bunlar inserted ve deleted tablolarıdır. Triger'ın türüne ve bu kapsamda yaptığı işleme göre yani insert işlemi gerçekleştiğinde inserted sanal tablosu, deleted işlemi gerçekleştiğinde deleted tablosu çalışmaktadır. Bu tablolar triger'ın içerisinde ki base tablolardır. Updated işleminde ise inserted ve deleted tabloları birlikte çalışmaktadır. Yani trigger içerisinde updated gibi bir base tablo bulunmamaktadır.
--Triger'lar iki ayrılırlar
--DDL (Data Definition Language) ve DML (Data Manuplation Language) olamk üzere iki ayrılırlar.
-- DDL ise kendi içerisinde iki ayrılmaktadır. Bunlar "after" ve "insted of" trigger'lardır.
--After trigger yaptığımız işlemden sonra devreye girmektedir. (Insert, update ve delete)
--Insted of ise bir işlem yapılmak istendiğinde o işlem yerine devreye giren trigger'lardır.
--Not: After trigger'da herhangi bir tabloya insert, update ve delete işlemleri gerçekleştikten sonra otomatik olarka devreye girecek trigger'lar yazacağız.
--Bir üründen sipariş alınınca, ilgili ürünün stok miktarını düşünmemiz gerekmketedir. Her bir sipariş alınıdğında stok düşürme işlemini ele yapmamız saçmalık olur. Örnğin bir e-ticaret sitedinde süratli bir şeklilde sipariş alındıkça ilgili ürünün stok durumu düşürülmelidir ve bunu manuel yapmamız söz konusu değildir. Burada tam olarak trigger devreye giremektedi. Order details tablosuna bir insert işlemi gerçekleştiğinde yazacağımız trigger devreye girecek ve Products tablosundaki stok miktarını siparişin quantity bilgisine göre düşürecektir.
--Trigger'ın yaratılırken hangi tabloda tetikleneceğini belirtmemiz gerekmektedir. Bu yüzden trigger create ederken çalışacağı tabloyu belirtiyoruz
create trigger trg_SiparisSilidi on [Order Details]
after delete
as
Begin
declare @kacAdet int, @hangiUrun int;
select @hangiUrun = ProductID, @kacAdet = Quantity from deleted -- bu businnes'ta delete işlemi gerçekleştiğinden "deleted" sanal tablosundan faydalanıyoruz
Update Products
Set UnitsInStock = UnitsInStock + @kacAdet
where ProductID = @hangiUrun
End
--Delete işlemi gerçekleşirken yazdığımız trigger "trg_SiparisSilidi" otomatik tetiklenecek ve Product tablsunda ProductID = 42 olan ürünün stok miktarını tetiklenecek.
delete from [Order Details] where OrderID = 10248 and ProductID = 42
--Employees tablomuzdan bir kullanıcıyısiliyoruz.Lakin gerçekleşecek delete işlemi yerine bir trigger tetikleyeceğiz. Bu senaryo için ilk önce Employess tablomuza isDelete sütunu ekleyelim
alter table Employees add isDelete int --Emloyees tablosundan "isDelete" isimli "int" alanına sahip bir sütun yarattık.
select * from Employees
--Yukarıdaki işlemden sonra artık bir kullanıcı sileceğimiz zaman bu çalışan veri tabanından gerçekten remove etmek yerine ilgili çalışanı passif yada aktive çekeceğiz. Silme işlemi yerine çalışacak trigger yazalım.
create trigger trg_FiredEmployee on Employees
instead of delete
as
declare @firedEmployeeId int;
select @firedEmployeeId=EmployeeID from deleted
update Employees set isDelete=1 where EmployeeID = @firedEmployeeId
delete from Employees where EmployeeID =4