Передача переменной в триггер
у меня есть 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
для триггера он использовался только для иллюстрации.
6 ответов
Я использую SET CONTEXT_INFO
для такого рода действий. Это ссылка 2008+,до ссылке ушел в отставку.
в SQL Server 2005+ у вас будет CONTEXT_INFO
чтобы прочитать его, но в противном случае вы должны получить от
вы не можете передать переменную в триггер.
единственный способ получить информацию в триггере-это выбрать ее на основе вставленных или удаленных таблиц или добавить столбец в затронутую таблицу и поместить значение в этот столбец.
редактировать в предыдущем вопросе 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
вы не можете передавать переменные триггеров. В зависимости от того, как пользователи подключаются к базе данных, вы можете использовать SYSTEM_USER
для подключения текущего пользователя к базе данных.
вы не передаете переменные триггерам, потому что вы не можете вызывать триггеры напрямую. Они выполняются в результате вставки, изменения или удаления данных.
почему бы не попробовать это:
CREATE TRIGGER trgDataUpdated
ON tblData FOR UPDATE
AS
BEGIN
EXECUTE tbLogUpdate intUserId
END
старый вопрос, но мне интересно, почему никто не упомянул, что временные таблицы, созданные до вызова триггера, видны в триггере? Итак, это сработает:
SELECT 10 intUserID INTO #intUserID
UPDATE tblData
SET Value = @x
триггер увидит временную таблицу #intUserID и может прочитать идентификатор оттуда.