SQL Server ile programlamada bazı durumlarda oturuma özel bir yönlendirme yapma ihtiyacı doğabilir. Bunu yapabilmek için oturumun tekilliğini sağlamak gerekiyor. Bunun yapmanın en basit mantığı o oturumu özelleştirmek için bir parametre gibi bir alan kullanılabilir. Ardından SQL Server tarafında o parametrenin değerine göre koşul yazılabilir. Fakat bunu yapabilmek için her kod parçacığında bu şekilde ek bir parametre veya alan oluşturmak gerekiyor. İşte bu noktada SQL Server’in sunduğu Session Context Information alanı kolaylık sağlamaktadır. Session context information, 128 byte boyutunda bir değer tanımlanmasına izin vererek aynı oturumda multiple batche, stored procedure, triggers veya user-defined function gibi objeler tarafından bu değere otomatik olarak erişilmesini sağlar. O an bu değeri oluşturmak için SET CONTEXT_INFO ifadesi kullanılır. Bu değere o oturumda erişmek için CONTEXT_INFO() fonksiyonu kullanılır. Ayrıca sys.dm_exec_requests, sys.sysprocesses ve sys.dm_exec_sessions DMV’lerde session context’in binary değeri okunabilir. Böylece bu değere göre arama yaparak o oturuma ait talebin yürütülme durumu takip edilebilir.
Aşağıdaki örnekte “akaymaz” ifadesi context info’ya aktarılmış aynı şekilde bu nesneden okuma yapılmıştır.
DECLARE @Ctx varbinary(128) SELECT @Ctx = CONVERT(varbinary(128), 'KullaniciAdi:akaymaz') SET CONTEXT_INFO @Ctx DECLARE @CtxData varchar(128) SELECT @CtxData = CONVERT(VarChar(128), CONTEXT_INFO()) SELECT @CtxData as "Context Info", @Ctx as "Context Info Binary" SELECT context_info FROM sys.dm_exec_requests WHERE session_id=@@SPID SELECT context_info FROM sys.sysprocesses WHERE spid=@@SPID SELECT context_info FROM sys.dm_exec_sessions WHERE session_id=@@SPID
Örneğin uygulama içerisinden çalıştırdığımız prosedür, fonksiyon veya trigger gibi bir nesne içerisinde “eğer kullanıcı ‘akaymaz’ ise ek olarak şunu yap” şeklinde yönlendirme yapabiliriz. Aşağıdaki trigger MUSTERI tablosu üzerinde oluşturulmuş olup Context’teki değere göre işlemin yapılıp yapılmayacağına karar verilmektedir.
--MUSTERI isimli tablomuz olsun CREATE TABLE MUSTERI(SatirId int, AdSoyad VARCHAR(100)) --Bu tablo üzerinde bir trigger oluşturalım CREATE TRIGGER trgMusteri ON MUSTERI AFTER INSERT,DELETE,UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @KullaniciAdi varbinary(128) SELECT @KullaniciAdi = CAST('akaymaz' as varbinary(128)) IF @KullaniciAdi = CONTEXT_INFO() BEGIN PRINT 'Kayıt işlemi başarısız oldu.' RAISERROR('MUSTERI tablosuna Insert/Update/Delete işlemine izin verilmedi',15,1) ROLLBACK TRAN END ELSE PRINT 'Kayıt işlemi başarılı oldu.' END
Şimdi bu tabloya INSERT işlemi yapalım. Her Insert öncesi Context Info’yu değiştirelim.
DECLARE @Ctx varbinary(128) SET @Ctx = CONVERT(varbinary(128), 'user1') SET CONTEXT_INFO @Ctx INSERT MUSTERI VALUES(1,'Ahmet Kaymaz') GO PRINT ' ' DECLARE @Ctx varbinary(128) SET @Ctx = CONVERT(varbinary(128), 'akaymaz') SET CONTEXT_INFO @Ctx INSERT MUSTERI VALUES(1,'Zeynep Kaymaz')