2016-08-16 236 views
1

我有一個表中的兩個觸發器,在插入一個火災和從INSERT觸發器更新時觸發更新後未觸發

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE entryTable 
    SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
        FROM shiftTeamMemb 
        WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
    FROM entryTable 
    INNER JOIN inserted i ON i.ID = entryTable.ID 
END 

而第二個觸發更新

後與來自其他表的其他信息更新該行
CREATE TRIGGER [dbo].[eThistoryUpdTg] ON [dbo].[entryTable] 
AFTER update 
AS 
BEGIN 
    INSERT INTO eThistory(my columns) 
     SELECT 
      *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
     FROM 
      deleted 
END 

我需要做的是不火AFTER UPDATE觸發,當我與AFTER INSERT觸發更新行。可能嗎 ?

+0

你'插入'觸發似乎被打破。這個子查詢是不相關的(它引入了一個單獨的引用來插入''而不是我猜你正在嘗試做什麼,參考'i'),所以多行插入將產生一個錯誤,沿着「子查詢返回更多比一個價值「。 –

+0

哦,我現在看到了,更新了這個問題@Damien_The_Unbeliever –

+0

對不起,我錯了。它不會返回該錯誤。相反,它會默默地破壞你的數據,因爲你已經用'top 1'強制它。再次,這個子查詢是*不相關*。因此,如果'inserted'包含* multiple * rows與* different *'personalNumber'值,那麼*這些值中的一個將成功地在'shiftTeamMemb'中發生查找,然後*每個原來插入的行將接收該值。 –

回答

1

我建議你到這兩個觸發器合併爲一個:

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    UPDATE entryTable 
    SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
        FROM shiftTeamMemb 
        WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
    FROM entryTable 
    INNER JOIN inserted i ON i.ID = entryTable.ID 

    INSERT INTO eThistory(my columns) 
    SELECT 
     *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
    FROM 
     deleted 
END 

然後插入後,它將更新shiftTeam和'deleted1將不會被使用。

更新後,它將更新shiftTeam並使用deleted獲取以前(甚至更高版本)值。

或者,如果你不需要在此表上的UPDATE的情況下更新shiftTeam您可以添加IF語句:

CREATE TRIGGER [dbo].[eTteamTg] 
ON [dbo].[entryTable] 
AFTER INSERT, UPDATE 
AS 
BEGIN 

    IF (SELECT COUNT(*) FROM deleted) = 0 --That means it was INSERT 
    BEGIN 
     UPDATE entryTable 
     SET shiftTeam = (SELECT TOP 1 shiftTeamMemb.teamId 
         FROM shiftTeamMemb 
         WHERE shiftTeamMemb.personalNumber = i.personalNumber) 
     FROM entryTable 
     INNER JOIN inserted i ON i.ID = entryTable.ID 
    END 

    INSERT INTO eThistory(my columns) 
    SELECT 
     *, HOST_Name() + ' ' + SUSER_NAME() + ' Upd', GETDATE() 
    FROM 
     deleted 
END 
+0

太棒了!這正是我所需要的,我不知道你可以在更多的行動上做同樣的觸發。這種方式非常聰明。我必須使用第二種方法,因爲我只需要在插入時更新它 –

1

實現你的第二個觸發這個樣子,

CREATE TRIGGER [dbo].[eThistoryUpdTg] ON [dbo].[entryTable] 
AFTER UPDATE 
AS 
BEGIN 
    INSERT INTO eThistory (my columns) 
    SELECT * 
     ,HOST_Name() + ' ' + SUSER_NAME() + ' Upd' 
     ,GETDATE() 
    FROM deleted d 
    WHERE NOT EXISTS (
      SELECT TOP 1 shiftTeamMemb.teamId 
      FROM shiftTeamMemb 
      INNER JOIN inserted I ON i.personalNumber = shiftTeamMemb.personalNumber 
      INNER JOIN entryTable E ON E.ID = I.ID 
      WHERE shiftTeamMemb.personalNumber = i.personalNumber 
      ) 
END