2017-10-05 170 views
0

我有2個datatriggers,都應該經過更新插入另一個火。這是更新觸發年初的樣子:AFTER UPDATE觸發器盯着INSERT觸發 - SQL服務器

USE [Database] 
    GO 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER TRIGGER [dbo].[UpdateTrigger] 
    ON [dbo].[Table1] 
    AFTER UPDATE 
    AS 
    BEGIN 
    (...) 

後插入觸發器長得一模一樣,除了一個事實,即還有的後面插入,而不是更新後。當我更新Table1時,只會觸發更新觸發器。但是,當我插入時,兩個觸發器都被觸發。爲什麼?我該如何解決它?

+0

沒有看到兩個觸發器中的代碼,我們無法確定這裏發生了什麼。 –

+0

你所描述的是不可能的。如果觸發器被定義爲AFTER UPDATE,它不會在INSERT後觸發。你能分享你的觸發器代碼嗎? –

+0

如果我們假設*您的插入觸發器更新了同一個表,那麼該操作將導致更新觸發器執行。而且我還會猜測,您基於更新觸發器的效果進行觀察,而無需實際調試代碼以「查看」插入的觸發器的效果。也許更新觸發器會覆蓋插入觸發器的影響? – SMor

回答

0

觸發器觸發時會出現2個虛擬表格:DELETED和INSERTED。插入記錄時,只有INSERTED表中有記錄,但是當您更新記錄時,在DELETED表中有舊記錄,而在INSERTED表中有新記錄。所以,基本上當你做UPDATE時,你在做DELETE和INSERT。通過識別DELETED表中是否有記錄,您可以輕鬆解決該問題。如果有,那麼它是UPDATE,如果沒有,那麼它是INSERT。

+0

我試着檢查是否有使用以下命令DELETED中的任何記錄:IF EXISTS(SELECT * FROM DELETED),但條件返回true,雖然它是一個插入。我使用錯誤的語法嗎? – JerryBox

+0

我不確定在語法上是否存在問題,但是如果您在插入DELETED表後插入了記錄,那麼肯定有錯誤 –

+0

您可以爲插入和更新創建1個觸發器。 CREATE TRIGGER xxx ON xxx後插入,更新... –