2010-03-11 84 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。改變「從插入」到「從刪除」,這應該工作。