我有以下觸發代碼,這是工作的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 ......沒有錯誤
你肯定不會有任何侵犯PK?還是唯一索引/約束違規?或者可能沒有從'SELECT'語句返回的值?你檢查過所有這些嗎? –
爲什麼你在存在聲明中使用top 1?爲什麼不在你的exists語句中使用select *?這是select *完全可以接受的地方。它還消除了當您忘記FROM時意外地將您的標量值視爲已刪除的標量值。 –
我只是簡單**將**分成**兩個不同的觸發器 - 一個用於更新,一個用於插入。這樣你就不需要小心地弄清楚這個觸發器的操作是什麼 - 從觸發器的定義中可以清楚地看到...... –