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