Trigger Mimarisi (Dml Trigger-1)

Sql Server gibi ilişkisel veritabanı yönetim sistemlerinde tablo veya view üzerinde gerçekleştirilen insert,update, delete gibi DML işlemlerini ve veritabanı veya server seviyesinde create,alter, veya drop gibi DDL işlmelerinden biri gerçekleştiğinde tetiklenip çalışacak olan Sql Server objelerine trigger denir. DML ve DDL işlemlerinin performanslarını takip edilirken triggler mutlaka kontrol edilmelidir. Yapacağımız işlem uzun zaman alıyorsa buna ilgili tabloda yada server üzerinde tanımladığımız trigger sebep olabilir.

DML TRİGGER

Dml triggerları sadece yenir bir kayıt eklendiğinde, silindiğinde yada güncelleme yapıldığında çalışır. Triggerların hangi işlem den sonra tetikleneceğini bizim belirtmemiz gerekir. Tüm dml işlemlerini içeren tek bir trigger yazabiliriz.

DML trigger’ları da kendi içinde AFTER ve INSTEAD OF trigger’ları olmak üzere ikiye ayrılmaktadır. After triggerları sadece tablo üzerinde tanımlanan ve DML işlemi gerçekleşip bittikten sonra çalışan kod bloklarıdır. Instead of trigglerları ise hem tablo hemde view’ler üzerinde gerçekleştirilen DML işlemleri yerine çalışacak olan kod bloklarıdır.Instead of triggerları hem istediğimiz tablo yada view’ler üzerinde bize yetkinlik sağlayacaktır. İstediğimiz tablo yada view’lere uygulama aracılığıyla işlem yapılmasını istemiyorsak ama eğer gerçekten gerekliyse bu tip trigger sayesinde bizim kontrolümüzde gerçekleşebilir.

Trigger yazarken dikkat etmemiz gereken noktalar: 

— Oluşturduğumuz trigger’ı tetikleyen müdahale edebileceğimiz bir kod ise trigger kullanmak yerine bu işlemi t-sql kodu ile yapmalıyız.

— Non-Logged yani log’lanmayan işlemlerin yapılması trigger’ları tetiklemez. Truncate table writetext gibi komutlar trigger’ların tetiklenmesi sağlamaz.

— Trigger’lar ilişkili oldukları tablo üzerinde gerçekleştirilen dml işlemlerinin performansını da etkileyecektir. Yani insert, update, delete gibi dml işlemleri ile tetiklenecek dolayısıyla dml işlemlerinin süresi uzayacaktır. Eğer gereksiz ise trigger kullanılmamalıdır.

After DML Trigger 

Bit tablo üzerinde gerçkleştirilen insert, update, delete gibi dml işlemlerinin başarılı bir şekilde tamamlanmasıyla otomatik olarak tetiklenen trigger’lara after dml trigger denmektedir.

Triggerların tetiklenmesini sağlayacak, dml triggerları tetiklendiğinde sql server tarafından otomatik olarak oluşturulan deleted ve inserted adlı iki tane sanal tablo oluşur. Bu tablolar trigger’ımızın tetiklenmesini sağlayacak olan işlem sonucunda etkilenen kaydın bilgisini tutmaktadır. Herhangi bir tabloya insert yapıldığında inserted sanal tablosunda kaydın bir kopyası tutulmaktadır. Aynı şekilde bir kayıt silindiğinde deleted adlı sanal tabloda silinen kaydın bir kopyası tutulmaktadır. Update dml işlemi için ise updated tablosu yerine inserted ve deleted (update edilen bir kayıt önce silinip sonra yeni hali eklenir.) tablolarına olmak üzere iki kayıt atılmaktadır.

AdventureWorks 2012, production.produc tablosu için  delete ve insert loglarımızı tutacağımız tabloyu oluşturalım.Tablodaki 3 alana ek olarak operation adlı bir alan (ne işlemi yapıldığı bilgisini tutacak) ve modifieddate (işlemin ne zaman yapıldığını tutacak) adlı ikinci alanı log tablomuza ekledik.

AdventureWorks 2012 databaseinde Product şemasın altındaki ProductInventory tablosu için log tablomuzu ve triggerımızı  oluşturduk


create table Production.ProductInventoryLog
(
 Operation varchar (10) not null,
 ProductID int not null,
 LocationID int not null,
 Shelf varchar (10) not null,
 Bin tinyint not null,
 Quantity smallint not null,
 rowguid uniqueidentifier not null,
 ModifiedDate datetime not null
)

 

create trigger Production.Trg_ProductInventoryLog
on Production.ProductInventory
after insert,delete
as
begin
set nocount on
--insert işlemlerinin loglanması
insert Production.ProductInventoryLog
(Operation,ProductID,LocationID,Shelf,Bin,Quantity,rowguid,ModifiedDate)
select distinct 'Insert', i.ProductID, i.LocationID,i.Shelf,
i.Bin, i.Quantity, i.rowguid,GETDATE()
from inserted i

--delete işlemlerinin loglanması
insert Production.ProductInventoryLog
(Operation,ProductID,LocationID,Shelf,Bin,Quantity,rowguid,ModifiedDate)
select distinct 'Insert', d.ProductID, d.LocationID,d.Shelf,
d.Bin, d.Quantity, d.rowguid,GETDATE()
from deleted d

end

 İnsert ve delete sorgularımızı yazıp, log tablomuza bakalım.

insert Production.ProductInventory (ProductID,LocationID,Shelf,Bin,Quantity) values (317,6,'A',4,22)
delete Production.ProductInventory where ProductID=317 and LocationID=6
select * from Production.ProductInventoryLog

İyi çalışmalar.

Bir cevap yazın

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