Получить идентификатор вставки внутри триггера

У меня есть TableA и TableB в SQL Server 2008.

У TableA есть триггер, который срабатывает после INSERT & UPDATE. По триггеру я вставляю в TableB, поэтому мой вопрос: как я могу получить вставленный идентификатор из TableB? FROM INSERTED содержит информацию о записи в таблице A?

ALTER TRIGGER [dbo].[trg_up_move] ON [dbo].[TableA] AFTER INSERT, UPDATE
AS 
BEGIN
DECLARE @idMovINS INT
DECLARE @stationINS char(8)
DECLARE @idWorkerINS INT
DECLARE @statusINS TINYINT
SELECT @idMovINS=id_mov FROM INSERTED
SELECT @stationINS=station_number FROM INSERTED
SELECT @idWorkerINS=id_worker FROM INSERTED
SELECT @statusINS=status_mov FROM INSERTED
-- CODE

-- MORE CODE

-- MUCH MORE CODE

  IF @SOMEVAL='WISE DECISION'
  BEGIN
     DECLARE @idTableB INT
     INSERT INTO TableB (FieldA,FieldB,FieldC)VALUES(@idWorkerINS,@stationINS,'More info')
     --SET @idTableB=@@IDENTITY
     --SET @idTableB=SCOPE_IDENTITY()

     --MAKE SOME OTHER THINGS WITH @idTableB
  END
END

Если я отправлю сотню или тысячу вставок в таблицу A в одном и том же сеансе. Могу ли я использовать @@identity или scope_identity() (я выбираю последнее), чтобы получить идентификатор вставки b? И насколько удобно и безопасно использовать одну из этих двух функций с учетом каждого срабатывания триггера и времени выполнения всех функций триггера


person Robert K    schedule 26.04.2016    source источник
comment
Возможный дубликат В чем разница между Scope_Identity( ), Identity(), @@Identity и Ident_Current?   -  person Yuck    schedule 26.04.2016


Ответы (1)


Триггеры устанавливаются на основе. Таким образом, идея получения единой идентичности ошибочна.

Ака, если вы вставите 10 строк, «вставленная» таблица будет иметь 10 строк.

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

create table PrimaryHolderTable ( i int identity (1001,2) not null primary key, j int not null unique )
create table #OutputResultsHolder ( i int not null, j int not null)

insert into PrimaryHolderTable (j)
output inserted.i, inserted.j into #OutputResultsHolder
select top 10 o.object_id from sys.objects as o order by o.object_id desc /*<< from sys.objects is there just to provide some rows */


select * from #OutputResultsHolder
drop table #OutputResultsHolder, PrimaryHolderTable;

go



create table dbo.EmployeeTable ( EmpKey int identity(1001,2) ,  EmpAge int not null );
create table dbo.AuditTable ( EntityKey int not null default -1  ,  OldValue int null, NewValue int null , Tag varchar(64)  );

insert into dbo.EmployeeTable (EmpAge)
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable ( EntityKey , OldValue , NewValue , Tag)
 values( 18 );

insert into dbo.EmployeeTable (EmpAge)
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable ( EntityKey , OldValue , NewValue , Tag) 
 values( 20 );

insert into dbo.EmployeeTable (EmpAge)
output inserted.EmpKey , null , inserted.EmpAge , 'Employee Inserted' into dbo.AuditTable ( EntityKey , OldValue , NewValue , Tag) 
 values( 22 );


update dbo.EmployeeTable
   set EmpAge  = EmpAge + 1
output inserted.EmpKey , deleted.EmpAge, inserted.EmpAge , 'Employee Updated' into dbo.AuditTable ( EntityKey , OldValue , NewValue , Tag)
 where EmpAge <=20;

delete from dbo.EmployeeTable
output deleted.EmpKey , deleted.EmpAge, NULL , 'Employee Deleted'  into dbo.AuditTable (EntityKey , OldValue , NewValue , Tag)
 where EmpAge > 0; /*Test multi rows*/

select * from dbo.EmployeeTable; /* <<will be empty at this point */
select * from dbo.AuditTable;

drop table dbo.EmployeeTable, dbo.AuditTable;
go 
person granadaCoder    schedule 26.04.2016
comment
У меня когда-то был продавец, который не понимал эту функцию триггеров. У них был триггер на столе с подзапросом. Если вы выполнили какой-либо DML для набора из более чем 1, это приведет к тому, что подзапрос вернет более одной ошибки строки. - person Arthur D; 26.04.2016
comment
Я хорошо знаю, как работают триггеры, я не говорю, что у меня будет одна личность, я говорю о процессе, который срабатывает, когда одна запись вставляет его. Может быть, я пойду для редактирования cuestion. - person Robert K; 26.04.2016