CONTEXT_INFO

Objavljeno: 14-03-2014 | Autor: Milen Blagojević | Kategorija: T-SQL, Trikovi

0

Context informacija je binarna vrednost veličine do 128 bajtova koja se može postaviti na nivou sesije i koristiti u procedurama, trigerima ili funkcijama koje se izvršavaju u okviru iste sesije.

Postoje dve komande koje se koriste za postavljanje i čitanje ove informacije:

  • SET CONTEXT_INFO – za upisivanje vrednosti
  • CONTEXT_INFO () – za čitanje vrednosti

Ova vrednost se takođe može pročitati i u sledećim DMVs:

  • sys.dm_exec_requests
  • sys.dm_exec_sessions
  • sys.sysprocesses

Primer:

DECLARE @ContextInfoValue VARBINARY(50),
		@Text NCHAR(50)

SET @Text = 'SQL Kefalo Context Info'
SET @ContextInfoValue = CAST(@Text AS VARBINARY(50))
SET CONTEXT_INFO @ContextInfoValue

SELECT context_info, CAST( context_info AS NCHAR(50) ) ContextInfoNchar
FROM sys.dm_exec_requests
WHERE session_id = @@SPID  -- id trenutne sesije

SELECT context_info, CAST( context_info AS NCHAR(50) ) ContextInfoNchar
FROM sys.dm_exec_sessions
WHERE session_id  = @@SPID -- id trenutne sesije

SELECT context_info, CAST( context_info AS NCHAR(50) ) ContextInfoNchar
FROM sys.sysprocesses
WHERE spid = @@SPID -- id trenutne sesije

SELECT CAST( context_info() AS NCHAR(50) ) ContextInfoNchar


Jedna od mogućnosti korišćenja CONTEXT_INFO je prilikom audita promena na tabeli.
Recimo da trebamo auditovati delete akciju nad tabelom zajedno sa korisnikom koji je izvršio akciju pomoću trigera:

CREATE PROCEDURE [dbo].[DeleteCrtaneEpizode]
	@EpizodaId INT,
	@KorisnikId NCHAR(50)
AS 
BEGIN
	DECLARE @ContextInfoValue VARBINARY(50)

	SET @ContextInfoValue = CAST(@KorisnikId AS VARBINARY(50))
	SET CONTEXT_INFO @ContextInfoValue

	DELETE FROM [dbo].[CrtaneEpizode]
	WHERE EpizodaID = @EpizodaId

END

I triger:

CREATE TRIGGER	[dbo].[tr_CrtaneEpizode_delete_Audit] on [dbo].[CrtaneEpizode]
FOR	DELETE
AS
BEGIN
SET NOCOUNT ON

	DECLARE @Izmenio NCHAR(50)

	SELECT @Izmenio = CONVERT (NCHAR(50),CONTEXT_INFO())
	IF @Izmenio IS NULL -- if the action is outside of the application
	BEGIN
		SELECT @Izmenio = SYSTEM_USER
	END
		INSERT INTO [dbo].[CrtaneEpizodeAudit]
           ([EpizodaID]
           ,[Naziv]
           ,[GodinaPremijernogIzvodjenja]
           ,[CrtacID]
           ,[Akcija]-- 1: delete, 2 - add, 3- update
           ,[Izmenio]
           ,[DatumIzmene])
		SELECT  EpizodaID,
				Naziv,
				GodinaPremijernogIzvodjenja,
				CrtacID,
				2,
				@Izmenio,
				GETUTCDATE()
		FROM deleted
END

Nakon poziva procedure:

EXECUTE DeleteCrtaneEpizode
	@EpizodaId = 2,
	@ModifiedBy ='Milen'

Biće upisan sledeći red u tabelu:

SELECT *
FROM [dbo].[CrtaneEpizodeAudit]