0

我有一个触发器,如果​​满足某个条件,我想做一些事情。

如果用户使系统从安全表中删除一行,并且该行恰好符合特定条件,我想运行一个存储过程。我遇到的问题是触发器的行为就像不满足 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

想法?

4

1 回答 1

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
于 2013-06-11T17:14:35.777 回答