簡體   English   中英

SQL Server 2005觸發器

[英]SQL Server 2005 triggers

我在表上創建了一個觸發器以進行更新。 如果發生任何更新,我想將舊值存儲在單獨的表中。 我正在嘗試從“插入”表中獲取舊值,但是更新后此表未填充舊值。

這是示例代碼:

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為null。

請讓我知道扳機有什么問題

DELETED表包含“舊”值,而“ INSERTED”表包含“新”值。

除此之外,如果您的更新影響多行,則INSERTED和DELETED表可能包含多行,因此,您可能應該使用INSERT SELECT而不是變量來運行插入。

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

“舊”值(在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

或類似的東西。

更新的記錄在DELETED虛擬表中,而不是INSERTED。 將“從插入”更改為“從已刪除”,這應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM