использование @@ identity, когда триггер срабатывает в ответ на INSERT, и триггер выполняет другой оператор INSERT - PullRequest
1 голос
/ 14 сентября 2011

У меня есть следующие таблицы:

tbl_workshop
id  int  identity
Name nvarchar(10)
Address nvarchar(40)


tbl_workshop_temp
id int identity
code int
InsUpkey  smallint

И у меня есть следующие заявления

insert into tbl_workshop
    (Name,Address)
     values('x','y')
select @@identity  -- My problem is here

И у меня тоже есть следующий триггер для вставки:

create trigger InsertedWorkshop
on tbl_workshop
for insert
as
  insert into tbl_workshop_temp
     (code,InsUpKey)
    select id,1
        from inserted

при выполнении оператора select @@identity я получаю id вставленной строки в tbl_workshop_temp вместо id, вставленной в tbl_workshop

Я знаю, что должен использовать scope_identity, но я не могу изменить код. Я просто могу изменить свой триггер. Что мне теперь делать? Пожалуйста, помогите мне.

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

Вы не можете обмануть @@identity, чтобы вернуть другое значение.Что вы можете сделать, это удалить свойство IDENTITY из tbl_workshop_temp и либо не иметь инкрементного значения в этом столбце (просто используйте тот же идентификатор, что и tbl_workshop), либо полностью удалить столбец, либо заполнить его в триггереспособ (это означает, что он будет работать только для одной строки):

DECLARE @id INT;

SELECT @id = MAX(id) + 1
   FROM dbo.tbl_workshop_temp WITH (UPDLOCK, HOLDLOCK); -- important

insert into dbo.tbl_workshop_temp
     (id,code,InsUpKey)
    select @id,id,1
        from inserted;

С SQL Server 2005 и выше вы можете получить более умный - вы можете изменить выше, так что он использовал ROW_NUMBER() дляобрабатывать несколько строк, или вы могли бы вместо этого использовать INSTEAD OF TRIGGER (без каламбура) и просто изменить порядок операторов вставки.Но с SQL Server 2000 ваши возможности действительно ограничены ...

1 голос
/ 14 сентября 2011

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

0 голосов
/ 11 июня 2014

Вы можете выбрать во вставленной строке с предложением где, как это

SELECT ID_FIRST_TABLE FROM TRIGGERED_TABLE WHERE TRIGGERED_ID = @@Identity
...