2017-03-27 150 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)'出了什么问题? –