如果AFTER DELETE中的语句触发不起作用

时间:2013-06-11 17:07:23

标签: sql sql-server-2008-r2

我有一个触发器,如果​​满足某个条件,我想做点什么。

如果用户导致系统从安全表中删除一行,并且该行恰好符合特定条件,我想运行存储过程。我遇到的问题是触发器的行为就像if语句的标准不符合一样。我知道标准正在得到满足,因为我尝试将有问题的变量汇总到一个表中,我想出的值是正确的。

如果我删除了IF语句,程序就会运行(虽然不加选择地......它会按预期运行,无论删除表中的personorgroup字段的值是什么,这不是我想要它做的。)

这是触发器:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter TRIGGER dbo.SecurityPersonRemoval
   ON  dbo.[security]
   AFTER delete
AS 
BEGIN
    SET NOCOUNT ON;

    declare @person int
    declare @thing int

    select @person = personorgroup from deleted
    select @thing = thing from deleted

    if @person = '37671721'
       exec docsadm.ethicalwall @thing

END
GO

想法?

1 个答案:

答案 0 :(得分:0)

您的陈述可能会失败,因为“已删除”可能包含多条记录。将select的值分配给标量只会返回第一个personID,其余的将被忽略。如果必须为每个被删除的人调用docsamd.ehticalwall,可以使用游标:

declare @personId int,
        @thingId int,
        @fetchStatus int

declare myDeletedPeople cursor for select personorgroup, thing from deleted readonly

open myDeletedPeople

fetch myDeletedPeople into @personId, @thingId

select @fetchStatus = @@FETCH_STATUS

while (@fetchStatus=0)
begin

       if(@personId = '37671721')
       begin
           exec docsadm.ethicalwall @thingId
       end

   fetch myDeletedPeople into @personId, @thingId

   select @fetchStatus = @@FETCH_STATUS

end

close myDeletedPeople
deallocate myDeletedPeople
相关问题