Передайте переменную в триггер

У меня есть a trigger который имеет дело с некоторыми данными для входа целей как так:

CREATE TRIGGER trgDataUpdated
   ON tblData FOR UPDATE
AS 
BEGIN
    INSERT INTO tblLog ( ParentID, OldValue, NewValue, UserID )
    SELECT  deleted.ParentID, deleted.Value, inserted.Value, 
            @intUserID -- how can I pass this in?
    FROM    inserted INNER JOIN deleted ON inserted.ID = deleted.ID
END

Как я могу передать в переменной @intUserID в вышеупомянутый триггер, как в следующем коде:

DECLARE @intUserID int
SET @intUserID = 10

UPDATE tblData
SET    Value = @x

PS: Я знаю, что не могу буквально передать в @intUserID к триггеру это просто использовалось в целях иллюстрации.

16
задан gotqn 26 July 2015 в 10:32
поделиться

4 ответа

Я использую SET CONTEXT_INFO для такого рода действий. Это ссылка 2008+, предыдущая ссылка была удалена.

В SQL Server 2005+ у вас будет CONTEXT_INFO , чтобы прочитать его, но в противном случае вы должны получить из столбца context_info в dbo.sysprocesses .

10
ответ дан 30 November 2019 в 22:49
поделиться

вы не можете передать переменную в триггер.

единственный способ получить информацию в триггере - это иметь возможность ВЫБРАТЬ ее на основе таблиц INSERTED или DELETED или добавить столбец в затронутую таблицу и поместить значение в этот столбец.

ИЗМЕНИТЬ в предыдущем вопросе, который OP опубликовал по этому поводу, они сказали, что не хотят использовать CONTEXT_INFO, но здесь они говорят, что это нормально, поэтому вот пример использования CONTEXT_INFO:

в процедура, выполняющая обновление

DECLARE @intUserID     int
       ,@CONTEXT_INFO  varbinary(128)
SET @intUserID = 10
SET @CONTEXT_INFO =cast('intUserID='+CONVERT(varchar(10),@intUserID)+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do update that will fire the trigger

SET CONTEXT_INFO 0x0 

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

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

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

..use the @intUserID
5
ответ дан 30 November 2019 в 22:49
поделиться

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

1
ответ дан 30 November 2019 в 22:49
поделиться

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

-1
ответ дан 30 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: