0

所有id列都有 auto_increment

在我的触发器中:

    ALTER trigger [dbo].[mytrig] 
on [dbo].[requests]
after INSERT, UPDATE 
as
begin 
declare @MyId1 int
set @MyId1 = (select Id from inserted)
declare @MyId2 int
declare @MyId3 int 
if (select column1 from inserted) = 1
begin
insert into [dbo].[contracts] select column1,column2,column3 .... from inserted
set @MyId2 = SCOPE_IDENTITY()
insert into [dbo].[History] select column1,column2,column3 ....  from inserted
set @MyId3 = SCOPE_IDENTITY()
insert into [dbo].[contracts_depts](Id_Contract ,column5)  select @MyId2,column6 from request_depts where Id_request=@MyId1
insert into [dbo].[History_depts]  (Id_InHistory,column5)  select @MyId3,column6 from request_depts where Id_request=@MyId1
end
end

@MyId1仅在更新后而不是在插入后返回值。我必须使用scope_identity()还是什么?

4

1 回答 1

0

您的主要问题是:您假设触发器每行调用一次 - 事实并非如此!

每个语句调用一次触发器,如果​​您的语句影响多行,则Inserted伪表将包含多行- 所以您的语句在这里

set @MyId1 = (select Id from inserted)

真的不会工作 - 它会选择一个任意行(不管有多少行)。

你需要重写你的触发器来考虑这个事实!假设Inserted包含 100 行 - 你想如何处理?你想达到什么目的?触发器不返回值- 它们将记录到审计表中,或更新其他行,或类似的东西....

于 2013-09-21T14:55:12.550 回答