Возможно ли для триггера найти имя хранимой процедуры, которая изменила данные? - PullRequest
11 голосов
/ 24 ноября 2010

Существует несколько хранимых процедур, которые обычно вызываются несколькими различными системами для обслуживания нескольких таблиц в нашей базе данных.Некоторые автоматизированы, некоторые нет.

В одной из таблиц есть столбец, в котором иногда отключается число, и мы не знаем наверняка, когда и почему это происходит.Я хочу поставить триггер на таблицу, чтобы я мог видеть, что и когда изменяется, но также было бы полезно узнать, какая процедура инициировала изменение.

Можно ли получить имяхранимая процедура из триггера?Если нет, есть ли другой способ узнать, что вызвало изменение чего-либо?(Я не говорю о пользователе, имя пользователя в этом случае не помогает).

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Вы можете попробовать: CONTEXT_INFO

Вот пример использования CONTEXT_INFO:

в каждой процедуре вставки / удаления / обновления, которую вы хотите отслеживать, добавьте:

DECLARE @string        varchar(128)
       ,@CONTEXT_INFO  varbinary(128)
SET @string=ISNULL(OBJECT_NAME(@@PROCID),'none')
SET @CONTEXT_INFO =cast('Procedure='+@string+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do insert/delete/update that will fire the trigger

SET CONTEXT_INFO 0x0 --clears out the CONTEXT_INFO value

вот часть триггера для получения значения:

DECLARE @string         varchar(128)
       ,@sCONTEXT_INFO  varchar(128)
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE SPID=@@SPID

IF LEFT(@sCONTEXT_INFO,9)='Procedure'
BEGIN
    SET @string=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10)
END
ELSE
BEGIN --optional failure code
    RAISERROR('string was not specified',16,1)
    ROLLBACK TRAN
    RETURN
END

..use the @string
2 голосов
/ 02 апреля 2014

Наша система уже использует переменную CONTEXT_INFO для другой цели, поэтому она недоступна.Я также попробовал решение DBCC INPUTBUFFER , которое почти сработало.Недостатком входного буфера является то, что он возвращает только внешнюю вызывающую процедуру.Пример: procA вызывает procB, который запускает триггер.Триггер запускает DBCC INPUTBUFFER, который показывает только procA.Поскольку мой триггер искал procB, этот подход не удался.

Тем временем я создал промежуточную таблицу.Теперь procA вызывает procB.procB вставляет строку в промежуточную таблицу и запускает триггер.Триггер проверяет промежуточную таблицу и находит запись procB.По возвращении procB удаляет свою запись из промежуточной таблицы.Это игра-оболочка, но она работает.Я был бы заинтересован в любой обратной связи по этому вопросу.

0 голосов
/ 24 ноября 2010

Я не пробовал, но @@ PROCID выглядит так, как будто он может вернуть то, что вы хотите.

...