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]