teisipäev, 7. juuni 2011

Trigeri pinu

Mõnikord vaja teada, mis protseduur või SQL lausend põhjustab trigeri käivitamise
Trigeri pinu(trigger call-stack) teadasaamiseks saab kasutada DBCC INPUTBUFFER funktsiooni.

DML trigeri koodinäide

-- Püüame objekti ID kinni, kust trigeri väljakutse tehti DBCC INPUTBUFFER funktsiooni jaoks
DECLARE @temp2 NVARCHAR(4000), @temp NVARCHAR(MAX), @reqid INT
SET @reqid = ( SELECT request_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)
IF ISNULL(@reqid,0) = 0
SET @reqid = ( SELECT session_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)

--salvestame DBCC INPUTBUFFER funktsiooni väljakutsuva call stacki tabelmuutujasse
DECLARE @calls TABLE (EventType NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL, Parameters SMALLINT NULL, EventInfo NVARCHAR(4000) COLLATE DATABASE_DEFAULT NULL)
DECLARE @sl NVARCHAR(4000)
SET @sl='DBCC INPUTBUFFER('+CAST(@reqid AS NVARCHAR(20))+') WITH NO_INFOMSGS'
--käivitab trigeris DBCC INPUTBUFFER funktsiooni
INSERT INTO @calls EXEC(@sl)

-- Teeme nüüd pinust väljavõtte
SET @temp2 = NULL
SELECT @temp2 = COALESCE(@temp2+',','') + EventType+' '+EventInfo FROM @calls

@temp2 muutujas on trigeri pinu olemas