Yazdığımız kodların farklı kişilere göre farklı davranması, argo tabirle “adam seçmesi” çoğu zaman ihtiyaç duyulan bir özelliktir. Bunu .net tarafında çoğu zaman yapmışızdır, ancak Sql Server tarafında gerekli olduğu durumlar da olabilir mi ? Mesela bir kullanıcının yapacağı ve veritabanını meşgul edebilecek bir işlemin, diğer kullanıcıların performansını etkilememesini istediğimiz durumlar gibi.
Örnek olarak çok fazla data içeren Test adında bir tablomuz olsun ve burada yapılan kullanıcı işlemlerini log’ladığımız bir de Test_Log tablomuz olsun. Log’lama işlemini de trigger yardımıyla yapalım. Test üzerinde yapılan her işlem, Test_Log tablosuna kaydedilsin. Test tablosunda bir çok kolonu ve bütün satırları içeren yüklü bir update komutu çalıştırmam gerektiğinde, bunun diğer kullanıcıların performansını etkilememesi için Test_Log tablosuna yansımasını istemiyorum. Ancak sistem çalışır halde olduğundan, trigger’ı da disable etmemem gerekiyor. Böyle bir durumda yapmamız gereken CONTEXT_INFO ‘dan faydalanmak. CONTEXT_INFO değerini set etmek oldukça kolay:
SET CONTEXT_INFO 0x1256698456
SELECT CONTEXT_INFO()
Örnekte bahsettiğimiz trigger’a ise şu eklemeyi yapmamız gerekiyor:
CREATE TRIGGER TR_Test ON dbo.Test FOR INSERT,UPDATE,DELETE
AS
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = CONTEXT_INFO()
IF @Cinfo = 0x1256698456
RETURN
PRINT ‘Trigger Çalıştı’
Test tablosu üzerinde işlem yapmadan önce de trigger’da belirttiğimiz CONTEXT_INFO değerini belirlemeliyiz:
SET CONTEXT_INFO 0x1256698456
— UPDATE dbo.TEST …
Böylece trigger tetiklendiği halde Test_Log tablosu üzerinde işlem yapmasına engel olduk.
CONTEXT_INFO değerini, bu tip işlemlerde olduğu gibi aynı tabloyu kullanan farklı uygulamalarda, hangi uygulamanın ne zaman kullandığı gibi detaylı rapor gerektiren durumlar için de kullanabiliriz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar