SQL

Trigger

Triggerları yazarken düzene dikkat etmek adına (okunabilirlik) isimlendirmeyi TR_<TableName>_<ActionName> şeklinde yapmanız doğru olur.

DDL: Create, Alter ve Drop işlemlerinde işlem gerçekleştikten hemen sonra devreye girerler. Kullanımı aşağıdaki gibidir. Süslü parantez (Curly Brackets) içindekiler kullanabileceğiniz seçenekler / düzenlemeniz gereken alanlardır.

CREATE TRIGGER trigger_name
ON { DATABASE |  ALL SERVER}
[WITH ddl_trigger_option]
FOR {event_type | event_group }
AS {sql_statement}

Örnek:

CREATE TRIGGER TR_dbdummy_EraseBlock
ON DATABASE 
FOR drop_table
AS
BEGIN
    PRINT 'Tablo silme işlemi trigger tarafından engellendi.'
    ROLLBACK
END

Yukarıdaki kod bloğunu kaydettikten sonra aynı veritabanı/sunucu (seçiminize göre) içindeki herhangi bir tabloyu silmeye çalıştığınızda size hata verecektir. Kodlardan da görüldüğü gibi rollback ile sanaldaki işlemi gerçekleşmeden önce sonlandırıyor. Yapabileceklerinizin listesi:

  • CREATE_TABLE
  • CREATE_VIEW
  • CREATE_INDEX
  • CREATE_FUNCTION
  • ALTER_TABLE
  • ALTER_VIEW
  • ALTER_INDEX
  • ALTER_FUNCTION
  • DROP_TABLE
  • DROP_VIEW
  • DROP_INDEX
  • DROP_FUNCTION

DML: Tablo yada view üzerinde yapılan insert, update ve delete işlemlerinde devreye girer.

CREATE TRIGGER trigger_adi
ON tablo_adi
{FOR|AFTER|INSTEAD OF} {INSERT|UPDATE|DELETE}
AS
BEGIN
    --Sql ifadeler
END

After: İşlem yapıldıktan sonra

Instead of: Yapmak istediğimiz işlemin yerine çalıştırılacağını belirtiyoruz

Insert, Update, Delete: Tabloda hangi sql işlemi sırasında çalıştırılacağını belirtiyoruz.

Begin…..End: Trigger çalıştırıldıktan sonra çalıştırılacak kodların yer alacağı kısımdır.

Aşağıdaki kod, alışveriş yapılınca kullanıcı adı, alışveriş tarihi, ve sipariş ID kaydeder.

CREATE TRIGGER TR_ShoppingLog_ShortLog
ON ShoppingLog
AFTER INSERT
AS
BEGIN
    INSERT Orders (CustomerID, OrderDate, OrderID) VALUES((SELECT Customer_Id FROM INSERTED), SYSDATETIME(), (SELECT ID FROM INSERTED))
END

kod içinde geçen
SELECT Customer_Id FROM INSERTED
satırında, sunucuya gönderilen veri kaydedilmeden önce “inserted” isminde sanal tablosu oluşturulur ardından varsa ilgili trigger(lar) tetiklenir. İlgili trigger da bu sanal tablodaki veriyi kullanarak BEGIN ‘den sonra bu verileri işlemek ve/ya belirtilen tabloya yazmak için kullanır. Veriler “ShoppingLog” tablosuna gönderildiği için “inserted” tablosu “ShoppingLog” tablosunun sütunlarıyla aynı sütunlara sahiptir.

Yine aynı satırda kullandığım SYSDATETIME() bir sistem metodudur ve sunucunun saatini DateTime biçiminde döndürür (sunucunun saatinin program saatinden farklı olabileceğini unutmayınız).

Yazı oluşturuldu 38

Bir cevap yazın

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

Benzer yazılar

Aramak istediğinizi üstte yazmaya başlayın ve aramak için enter tuşuna basın. İptal için ESC tuşuna basın.

Üste dön