我有以下触发代码,这是工作的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时意外地将您的标量值视为已删除的标量值。 –
我只是简单**将**分成**两个不同的触发器 - 一个用于更新,一个用于插入。这样你就不需要小心地弄清楚这个触发器的操作是什么 - 从触发器的定义中可以清楚地看到...... –