2013-08-18 22 views
1

我试图调用ON Delete触发事件,但是当我尝试从Deleted表中选择行时,它是空的。已删除SQL Server虚拟表为空ON删除触发

是否有任何其他方式获取删除事件触发的行ID?

代码:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

ALTER TRIGGER [audit] 
    ON [dbo].[S_PARTY] 
    FOR DELETE 
AS 
    -- Insert statements for trigger here 
    DECLARE @id nvarchar(50) 
    SET @id = (Select ROW_ID from deleted) 

    BEGIN 

-- Insert statements for trigger here 

INSERT INTO [dbo].[S_AMF_AUDIT_ITEM] (ROW_ID) 
    VALUES (@id); 

END 

当此触发火灾,我得到错误的S_AMF_AUDIT_ITEM不允许空值。那么你能帮我这个获得执行delete命令的表的Id吗?

回答

2

你的触发器坏了。

它没有考虑到DELETE语句可能会影响零个或多个行。

对于DELETE FROM [dbo].[S_PARTY] WHERE 1 = 0可能会发生NULL问题。

一个固定的版本将是

ALTER TRIGGER [audit] 
ON [dbo].[S_PARTY] 
FOR DELETE 
AS 
    BEGIN 
     INSERT INTO [dbo].[S_AMF_AUDIT_ITEM] 
        (ROW_ID) 
     SELECT ROW_ID 
     FROM deleted; 
    END 
+0

工作! ..但我仍然不明白为什么SET @id =(从删除选择ROW_ID)不设置值。我确保一次只删除一行。并且Id从我尝试删除的位置存在于S_PARTY表中。 – rishman

1

触发器可以火0..N删除的行。例如:

delete YourTable 
where 1=2 

会在YourTable运行for delete触发。所以触发器必须能够处理零个或多个行。考虑重写你的触发器,如:

ALTER TRIGGER [audit] ON [dbo].[S_PARTY] FOR DELETE 
AS 
INSERT dbo.S_AMF_AUDIT_ITEM 
     (ROW_ID) 
SELECT ROW_ID 
FROM deleted 

这将适用于任何数量的插入行。