2017-03-27 149 views
0

我有以下觸發代碼,這是工作的UPDATE,但不能插入AFTER INSERT觸發器不觸發

(我們沒有錯誤)

CREATE TRIGGER [dbo].[tr_ClientHistoryTUPEEmployee] ON [dbo].t_HR_TUPEEmployee] 
AFTER INSERT, UPDATE 
AS 

DECLARE @Username int, @Inserted bit, @Deleted bit 
SELECT @Inserted = 0, @Deleted = 0 

DECLARE @fieldId int 
SELECT @fieldId = FieldID FROM t_ClientHistoryFieldConstants WHERE Descn = 'TUPE Start Date' 
IF @fieldId IS NULL 
    SET @fieldId = 9999 -- Improper value if field id not found 

IF EXISTS (SELECT TOP 1 1 INSERTED) 
    SET @Inserted = 1   

IF EXISTS (SELECT TOP 1 1 DELETED) 
    SET @Deleted = 1    

--Get username 
IF CHARINDEX('_',SUSER_SNAME()) = 0 
    BEGIN 
     SET @Username = CAST(SUSER_SID(SUSER_SNAME()) AS int) 
    END 
ELSE 
    BEGIN 
     SET @Username = SUBSTRING(SUSER_SNAME(),1,CHARINDEX('_',SUSER_SNAME()) - 1) 
    END 

IF (@Username = 1 and SUSER_SNAME()='sa') 
     SET @Username = -2 


IF (@Inserted = 1 and @Deleted = 0) -- only insert 
BEGIN 
    INSERT t_ClientHistory (ClientID, FieldID, OldValue, NewValue, ChangeDate, ChangedBy) 
    SELECT ClientID, @fieldId , '', convert(varchar,TUPEStartDate,103) , GetDate(), @Username 
    FROM INSERTED 
END 
ELSE IF (@Inserted = 1 and @Deleted = 1) -- update 
BEGIN 
    INSERT t_ClientHistory (ClientID, FieldID, OldValue, NewValue, ChangeDate, ChangedBy) 
    SELECT DEL.ClientID, @fieldId , IsNull(convert(varchar,DEL.TUPEStartDate,103),'(No Start Date)'), 
      IsNull(convert(varchar,INS.TUPEStartDate,103),'(No Start Date)'), GetDate(), @Username 
    FROM DELETED DEL 
      INNER JOIN INSERTED INS ON (INS.TUPEID = DEL.TUPEID) 
    WHERE IsNull(INS.TUPEStartDate,'1900-01-01') != IsNull(DEL.TUPEStartDate,'1900-01-01') 
END 

什麼可能我在這裏做 - 它編譯OK ......沒有錯誤

+1

你肯定不會有任何侵犯PK?還是唯一索引/約束違規?或者可能沒有從'SELECT'語句返回的值?你檢查過所有這些嗎? –

+1

爲什麼你在存在聲明中使用top 1?爲什麼不在你的exists語句中使用select *?這是select *完全可以接受的地方。它還消除了當您忘記FROM時意外地將您的標量值視爲已刪除的標量值。 –

+2

我只是簡單**將**分成**兩個不同的觸發器 - 一個用於更新,一個用於插入。這樣你就不需要小心地弄清楚這個觸發器的操作是什麼 - 從觸發器的定義中可以清楚地看到...... –

回答

2

您刪除將永遠真

IF EXISTS (SELECT TOP 1 1 DELETED) 
    SET @Deleted = 1 

所以這不會工作

IF (@Inserted = 1 and @Deleted = 0) -- only insert 

你可以使用return語句像下面

--check for updated 
    if exists(select 1 from inserted) and exists (select from deleted) 
    begin 

    return; 
    end 

--check for inserted 

if exists(select 1 from inserted) 
begin 

return; 
end 

--check for deleted 
if exists(select 1 from deleted) 
begin 

return; 
end 
+0

謝謝,我可以檢查一下,'Deleted'表總是會返回一行如果它是一個INSERT? –

+0

已刪除的表格不會有任何插入的數據 – TheGameiswar

+0

那麼'IF EXISTS(SELECT TOP 1 1 INSERTED)'和'IF EXISTS(SELECT TOP 1 1 DELETED)'出了什麼問題? –