SQL Server CONTEXT_INFO Kullanımı

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')

Bir cevap yazın

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