MICROSOFT SQL SERVER

Ders Notları

 

Trigger

 

Trigger nedir?

Trigger tetikleyici anlamına gelir programlarımızda belirli bir işlem gerçekleştiğinde programımızı tetiklemeye yarar veya tablolar arası veri bütünlüğünü korumak için kullanılırlar. Aslında triggerlar bir store proceduredür fakat farkı kendiliğinden çalışmasıdır.

 

Trigger Oluşturma:
Yeni bir trigger oluşturmak için aşağıdaki yapıyı kullanabiliriz.

 

CREATE TRIGGER /*TriggerAdı*/ ON /*TabloAdı*/
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
/*Yazmak istediğimiz sql komutları*/
END


Birinci satırda oluşturulacak triggerın hangi tablo için geçerli olacağı belirtiliyor, ikinci satırda ise triggerın hangi işlemler için çalıştırılacağı tanımlanıyor. Burada kullanılan AFTER sözcüğü triggerın tabloya kayıt eklendikten (silindikten veya güncellendikten) sonra çalıştırılacağını belirtiyor. After yerine Instead Of cümleside kullanılır ise trigger kayıt eklenmeden (silinmeden veya güncellenmeden) önce çalştırılır. Instead Of olarak tanımlanmış bir triggerda tabloya bir kayıt otomatik olarak eklenmez, ekleme işlemini trigger içerisinde bizim yapmamız gerekir. Yine ikinci satırda bulunan INSERT, UPDATE ve DELETE sözcükleri ise tablodaki hangi işlemlerde bu triggerın çalıştırılacağını belirler. Sadece DELETE yazarsak trigger tablodan kayıt silinmesi durumunda tetiklenecektir.

Bir tablo üzerinde trigger oluşturulmuş ise o tablo ile aynı yapıda 2 tane tablo SQL server tarafından tanımlanır. Bunlara INSERTED ve DELETED tablolar denir.

Trigger konusunun daha iyi anlaşılabilmesi için örnek olarak ürün tablomuzdan bir kayıt silindiğinde debug tablosuna silinen ürünü kaydeden bir trigger yazalım.

--Kayıt eklemeyi iptal eden trigger

create trigger goster on ogrenci
after insert
as
begin
rollback transaction
end

--Kayıt eklendiğinde tablodaki kayıtları gösteren trigger

create trigger goster on ogrenci
after insert
as
begin
select * from ogrenci

end

Örnek uygulama:

USE okul
CREATE TABLE ogrenciler(ogrencino int,ogrenciadi nvarchar(10),ogrencisoyadi nvarchar(15))
CREATE TABLE yenikayit(ogrencisay int)

 

CREATE TRIGGER [dbo].[yeni_ogrenci] ON [dbo].[ogrenciler]
FOR INSERT
AS
begin
DECLARE @yenisayi int
SELECT @yenisayi=ogrencisay FROM yenikayit
UPDATE yenikayit SET ogrencisay=@yenisayi+1
end


CREATE TRIGGER [dbo].[eski_ogr] ON [dbo].[ogrenciler]
FOR DELETE
AS
begin
DECLARE @eskisayi int
SELECT @eskisayi=ogrencisay FROM yenikayit
UPDATE yenikayit SET ogrencisay=@eskisayi-1
end

 

Veritabanımızdan veri silmek istendiğinde hem silme işlemini önleyelim hemde silemezsin mesajı yayınlayalım...

CREATE TRIGGER tr_UrunSil ON Urunler
AFTER DELETE
AS
BEGIN
INSERT INTO Debug SELECT 'Ürün Silindi : ' + CONVERT(Varchar,UrunID) + ', ' + UrunAdi FROM DELETED
END

 

Tanımlı olan triggerları aşağıdaki sql cümleleri ile enable veya disable edebiliriz.
DISABLE TRIGGER tr_UrunSil ON Urunler
ENABLE TRIGGER tr_UrunSil ON Urunler

 

Başka bir örnek olarak silinen ürün sipariş tablosunda mevcut ise silme işlemini iptal edelim.
CREATE TRIGGER tr_UrunSil ON Urunler
AFTER DELETE
AS
BEGIN
DECLARE @Uid INT
SELECT @Uid= UrunID FROM DELETED
IF EXISTS(SELECT * FROM Siparisler WHERE UrunID=@Uid)
BEGIN
Print 'Ürün siparişlerde mevcut, silinenmez'
ROLLBACK TRANSACTION
RETURN
END
END

KisiID, ZiyaretID,DegisiklikTarihi

CREATE TRIGGER trigger_Guncellendi
ON Kisiler
for UPDATE
as

declare @id int
select @id = ziyaretID from deleted -- güncelleme için kayıt önce deleted (silinenler)
-- tablosuna gönderilir ardından da kayıt insert edilir

UPDATE Kisiler
SET degisiklikTarihi = getdate() --güncelleme yapıldığı tarihi db ye eklemiş olduk
WHERE ziyaretID=@id
--Kullanıcının birden fazla kayıt silmesini engellemek için yazılan bir delete trigger örneği

CREATE TRIGGER trigger_Silindi --Trigger adı
ON Kisiler --İlgili Tablo
for DELETE --Oluşturulacak trigger türü
as
declare @sayi int
select @sayi = count(*) from deleted --Silme işlemi için deleted (Silinmişler)
--tablosuna gönderilen kayıt sayısı
if @sayi>1
begin
rollback transaction
end

 

 

ÖNCEKİ KONU   SONRAKİ KONU

 

Web hosting by Somee.com