SQL Server’da tablo veya görünümlerde(view) herhangi bir işlem çalıştırıldığında (DELETE, INSERT, UPDATE) başka işlemlerin de yapılması isteniyor ise tetikleyiciler kullanılır. Her ne kadar Univera bünyesinde geliştirilen yazılımlarda DML mantığında çalışan tetikleyicileri kullanmasak da (Entity Framework doğasına aykırdır, tartışma konusudur); loglama, veri tutarsızlığı vb. işler için yararlı olduklarını söylemek mümkündür. Tetikleyiciler SQL cümleleri ile oluşturulur. Tetikleyici oluşturmak için aşağıdaki sözdizimi kullanılır.
CREATE TRIGGER [şema adı.] triggerAdı On tablo_adı | görünüm_ adı [WITH dml_tetikleyici_seçeneği]
{
For | AFTER | INSTEAD OF } {[INSERT], [,],[UPDATE ],[,],[DELETE] }
[WITH APPEND]
}
AS sql ifadesi | EXTERNAL NAME method adı
SQL serverda 2 tür tetikleyici bulunmaktadır. Bunlar AFTER ve INSTEAD OF tetikleyicileridir.
- AFTER (Ardı Sıra Tetikleyiciler): İşlem gerçekleştikten sonra tetiklenirler. Veritabanındaki INSERT, UPDATE, DELETE işlemlerinde kullanılır Tetikleyici sql cümlesinde FOR kelimesinin yanında AFTER yada INSTEAD OF kelimesi yoksa SQL Server’da bu tetikleyicinin AFTER tetikleyicisi olduğunu anlarız. AFTER tetikleyicileri görünümlerde (view) kullanılmaz.
- INSTEAD OF(Yerine Tetikleyiciler) : INSTEAD OF tetikleyicileri belirtilen işlem yapılırken araya girerek (önce veya sonra) içerisindeki komutları yerine getirir. INSTEAD OF tetikleyicileri işlemlerin arasına girebildiğinden kontrol amaçlı kullanılabilirler. Temel veritabanı işlemlerinde INSTEAD OF tetikleyiciler de kullanılır. AFTER tetikleyiciler tablolarda tanımlanırken INSTEAD OF tetikleyiciler hem tablolarda hem de görünümlerde(viewlerde) tanımlanır. İşlemlerin arasında girerek işlem yaptıklarından kontrol amaçlı kullanılabilirler. WITH CHECK OPTION komutu ile yaratılan görünümlerde (view) INSTEAD OF tetikleyicisi kullanılmaz, sql server hata verir. Bu görünümlerde INSTEAD OF tetikleyicisi tanımlamadan önce WITH CHECK OPTION ifadesinin kaldırılması gerekmektedir.
After Tetikleyici Örnekleri:
Insert: Bir tabloya kayıt eklendiğinde başka bir tabloda işlem yapmak için insert tetikleyicisi kullanılır. Tabloya eklenen kayıt bilgilerine ulaşabilmek için inserted deyimi kullanılır. Aşağıdaki örneği verilen tetikleyici müşteri ödeme yaptığında müşterinin bakiyesinden ödeme tutarının çıkarılıp TBLCARIBAKIYE tablosunun güncellemesi için kullanılmaktadır.
CREATE TRIGGER TRG_CARIGUNCELLE ON TBLTAHSILAT
FOR INSERT
AS
BEGIN
DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
DECLARE @MUSTERIKOD INTEGER
SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI FROM INSERTED
UPDATE TBLCARIBAKIYE SET BAKIYE = BAKIYE - @TAHSILATTOPLAMI
WHERE MUSTERIKOD = @MUSTERIKOD
END
FOR INSERT
AS
BEGIN
DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
DECLARE @MUSTERIKOD INTEGER
SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI FROM INSERTED
UPDATE TBLCARIBAKIYE SET BAKIYE = BAKIYE - @TAHSILATTOPLAMI
WHERE MUSTERIKOD = @MUSTERIKOD
END
Delete: Bir tablodan kayıt silindiğinde başka bir tabloda işlem yapmak için delete tetikleyicisi kullanılır. Tablodan silinen kayıt bilgilerine ulaşabilmek için deleted deyimi kullanılır. Aşağıdaki örneği verilen tetikleyici müşteri ödeme yaptığında müşterinin ödemesi TBLTAHSILAT tablosundan silindiğinde TBLCARIBAKIYE tablosunda tahsilat iptali yapılan tutarı müşteri bakiyesine eklemek gerekmektedir.
CREATE TRIGGER TRG_TAHSILATIPTAL ON TBLTAHSILAT DELETE
AS
BEGIN
DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
DECLARE @MUSTERIKOD INTEGER
SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI
FROM DELETED
AS
BEGIN
DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
DECLARE @MUSTERIKOD INTEGER
SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI
FROM DELETED
UPDATE TBLCARIBAKIYE SET BAKIYE = BAKIYE + @TAHSILATTOPLAMI
WHERE MUSTERIKOD = @MUSTERIKOD
END
WHERE MUSTERIKOD = @MUSTERIKOD
END
Update: Bir tabloda güncelleme işlemi yapıldığında başka bir tabloda işlem yapmak gerekiyor ise update tetikleyicisi kullanmak gerekmektedir update kayıtlarına ulaşmak için updated gibi bir deyim bulunmaktadır. Update işlemi bilindiği gibi delete insert demektir. Eski kayıt bilgilerine ulaşmak için deleted, yeni kayıt bilgilerine ulaşmak için inserted deyimi kullanılmaktadır. Aşağıdaki örnekte tahsilat tablosunda müşterinin ödemesi değiştirildiğinde TBLCARIBAKIYE tablosundada bakiyenin güncellenmesi gerekmektedir.
CREATE TRIGGER TRG_BAKIYEGUNCELLE ON TBLTAHSILAT
FOR UPDATE
AS
UPDATE TBLCARIBAKIYE
SET BAKIYE = CB.BAKIYE + DTABLE.BAKIYE - ITABLE.BAKIYE
FROM TBLCARIBAKIYE CB
INNER JOIN deleted DTABLE ON CB.BAKIYE = DTABLE.BAKIYE
INNER JOIN inserted ITABLE ON CB.BAKIYE = ITABLE.BAKIYE
FOR UPDATE
AS
UPDATE TBLCARIBAKIYE
SET BAKIYE = CB.BAKIYE + DTABLE.BAKIYE - ITABLE.BAKIYE
FROM TBLCARIBAKIYE CB
INNER JOIN deleted DTABLE ON CB.BAKIYE = DTABLE.BAKIYE
INNER JOIN inserted ITABLE ON CB.BAKIYE = ITABLE.BAKIYE
Instead of Tetikleyici Örnekleri:
Insert: Bir tabloda insert işlemi uygulandığında tablo üzerinde INSTEAD OF INSERT tetikleyicisi varsa bu işlem tabloda gerçekleşmez, tetikleyicide yazılı kodlar çalışır. Eğer bu trigger içinde herhangi bir kod yazılmaz ise bu durumda tabloya kayıt eklenmeyecektir.
CREATE TRIGGER TRG_CARIBAKIYEEKLE on VIEWCARIBAKIYE
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO TBLCARIBAKIYE SELECT MUSTERIKOD, BAKIYE FROM inserted
END
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO TBLCARIBAKIYE SELECT MUSTERIKOD, BAKIYE FROM inserted
END
Delete: Bir tabloda delete işlemi uygulandığında tablo üzerinde INSTEAD OF DELETE tetikleyicisi varsa bu işlem tabloda gerçekleşmez, tetikleyicide yazılı kodlar çalışır.
CREATE TRIGGER TRG_TAHSILATSIL ON TBLTAHSILAT
INSTEAD OF DELETE
AS
UPDATE TBLTAHSILAT SET SONISLEMTARIHI = GETDATE()
WHERE TAHSILATID IN (SELECT TAHSILATID FROM DELETED)
Tetikleyicilerin Aktif ya da Pasif Edilmesi INSTEAD OF DELETE
AS
UPDATE TBLTAHSILAT SET SONISLEMTARIHI = GETDATE()
WHERE TAHSILATID IN (SELECT TAHSILATID FROM DELETED)
Bazı durumlarda işlemlerde tetikleyicileri pasif duruma almak ya da pasif durumdaki tetikleyiciyi aktif duruma getirmek gerekebilir. Bu işlemler için aşağıdaki sözdizimleri kullanılır.
Tetikleyiciyi aktif duruma getirme
ALTER TABLE <TABLO_ADI> ENABLE TRIGGER ALL |
ALTER TABLE <TABLO_ADI> DISABLE TRIGGER ALL |
Yorumlar
Yorum Gönder