2010-03-11 92 views
0

我创建了更新表的触发器。如果发生更新,我想将旧值存储在单独的表中。我试图从“插入”表中获取旧值,但此表不会在更新后使用旧值填充。SQL Server 2005中触发

下面是示例代码:

CREATE TRIGGER [dbo].[Logs_Update] 
    ON [dbo].[Logs] AFTER UPDATE 
AS 

DECLARE @url varchar(50) 

BEGIN 

SELECT @url = i.url 
    FROM INSERTED i 

INSERT INTO dbo.Triggers_tbl 
    (ID, URL) 
VALUES 
    (1000, @url) 

END 

我得到@url从inserted表为空。

请让我知道什么是错的触发

回答

2

删除表中包含了“老”的价值观和“插入的”表包含了“新”的价值观。

要添加到这一点,inserted和deleted表中可以包含多个行,如果你的更新影响多个行,因此,你可能应该运行与INSERT SELECT而不是可变的插入。

INSERT INTO dbo.Triggers_tbl(URL) SELECT d.url FROM DELETED d 
1

“旧”值(一个UPDATE后)在Deleted伪表可供选择:

CREATE TRIGGER [dbo].[Logs_Update] 
    ON [dbo].[Logs] 
    AFTER UPDATE 
AS 
    DECLARE @url varchar(50) 

    SELECT @url = d.url from deleted d 

    INSERT INTO dbo.Triggers_tbl(ID,URL) VALUES(1000,@url) 

由于HLGEM正确的评论, OP的代码假设将分别调用每行的触发器 - 这是不正确的。

有鉴于此,触发代码真的应该对付集更新行的,因此它应该是这样的:

CREATE TRIGGER [dbo].[Logs_Update] 
    ON [dbo].[Logs] 
    AFTER UPDATE 
AS 
    INSERT INTO dbo.Triggers_tbl(ID,URL) 
     SELECT 1000, d.url 
     FROM Deleted d 

或类似的东西。

+0

的触发STIL不好的编程技术,永远不要假设只有一条记录会在插入或删除。 – HLGEM 2010-03-11 17:51:18

+0

@HLGEM:完全品质协议没写这段代码要么 - 我只是想说明的OP如何使用“删除”表,而不是“未插入” - 这一切 – 2010-03-11 20:26:42

0

已更新的记录位于DELETED虚拟表中,而非INSERTED。改变“从插入”到“从删除”,这应该工作。