SQL

SQL Ders22- Trigger Kullanımı 1

Öncelikle bu dersimiz için ürün ve sipariş adında iki tablo oluşturalım.

CREATE TABLE Urun
(
      UrunID INT PRIMARY KEY IDENTITY(1,1),
      UrunAdi NVARCHAR(50),
      StokMiktari INT
)
  
CREATE TABLE Siparis
(
      SiparisID INT PRIMARY KEY IDENTITY(1,1),
      UrunID INT,
      SiparisMiktari INT
)

Şimdi de bu iki tablo arasındaki ilişkiyi belirtelim. Bu ilişki Sipariş kolonundaki UrunID ile Urun tablosundaki UrunID alanına referans vereceğini belirtelim.

ALTER TABLE Siparis
ADD CONSTRAINT FK_Siparis_UrunID FOREIGN KEY(UrunID)
REFERENCES Urun(UrunID)

Şimdi de Urun tablomuza birkaç veri girişi yapalım.

INSERT INTO Urun VALUES('Kitap',300)
INSERT INTO Urun VALUES('Defter',300)
INSERT INTO Urun VALUES('Silgi',300)

Şimdi de Siparis tablosuna insert yapalım. Ancak siparişi verirken, girmiş olduğumuz sipariş miktarı kadar, Urun tablosunda o ürün için tutulan StokMiktarı’nın da azalmasını istiyoruz. Bunun için bir trigger yazmamız gerekiyor. Data girişinin yapıldığı anda bu trigger tetiklenmesi için After kullanmalıyız.

CREATE TRIGGER trg_StokDusurme
ON Siparis
AFTER INSERT
AS
      DECLARE @siparisMiktar INT
      DECLARE @urunId INT
      SELECT @urunId=UrunID,@siparisMiktar=SiparisMiktari FROM inserted
      
      UPDATE Urun SET StokMiktari=StokMiktari-@siparisMiktar
      WHERE UrunID=@urunId

Yazmış olduğumuz bu trigger ile sipariş tablosuna her insert girdiğimizde sipariş miktarı kadar stok miktarı azalma gösterecektir.

INSERT INTO Siparis VALUES(1,50)

Burada 50 adet sipariş verdik ve iki tabloda birbirinden etkilendiği için iki satır bundan etkilendi diye uyarı mesajımızı da aldık.

Şimdi Urun tablomuzun son durumunu görelim.

Görüldüğü gibi 300 adet kitap temin etmiştik. Bunun 50 sini sipariş verdik ve stok miktarı olarak 250 adet kitap ürünümüz elimizde kaldı.

Şimdi de Delete ile ilgili bir örnekle konuyu anlatalım. Çalışanlar ve işten ayrılanlar diye iki tablo oluşturalım. Calisan tablosundaki kişinin bilgileri işten ayrılınca IstenAyrilanlar tablosuna ayrıldığı günün tarihi ile eklensin istiyorum. Böylece geçmişte kimlerle çalıştığımı da unutmamış olurum.

CREATE TABLE Calisanlar
(
      CalisanID INT PRIMARY KEY IDENTITY(1,1),
      CalisanAdi NVARCHAR(50),
)
  
CREATE TABLE IstenAyrilanlar
(
      CalisanIDID INT,
      CalisanAdi NVARCHAR(50),
      SilindigiTarih DATETIME
)

Calisanlar tablomuza birkaç kişi ekleyelim.

insert Calisanlar values('Sümeyra Akbıyık')
insert Calisanlar values('canan öz')
insert Calisanlar values('Elif can')

Şimdi ise “Sümeyra Akbıyık” kayıtlı çalışanımızı işten çıkarmak istiyoruz. Calısanlar tablosundan silinip IstenAyrilanlar tablosuna eklensin istiyoruz. Şimdi bu olay için trigger’ımızı yazalım.

CREATE TRIGGER TRG_IstenAyrilanlar
ON Calisanlar
AFTER DELETE
AS
      INSERT INTO IstenAyrilanlar
            SELECT *,GETDATE() FROM deleted

“Sümeyra Akbıyık” adlı çalışanımızın kaydını silelim.

DELETE Calisanlar WHERE CalisanAdi='Sümeyra Akbıyık'

Yine iki tablomuz da bundan etkilendiğini görüyoruz.Bu konumuzun da sonuna geldik. Bir sonraki konumuzda trigger’da instead of kullanımını anlatacağım.

hakkımdaki her şeyi bu blogda bulabilirsin. Haydi sende bir göz gezdirmeye ne dersin?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir