插入后触发更新表列?

时间:2014-02-06 07:39:44

标签: sql sql-server

我需要在同一个表中添加任何记录后更新表中的列

这是我的sql代码

CREATE TRIGGER [dbo].[EmployeeInsert]
ON  [dbo].[APP_Employees]
AFTER INSERT
AS 
BEGIN   
SET NOCOUNT ON;

DECLARE @EmployeeID AS bigint

SELECT @EmployeeID = ID FROM inserted 

UPDATE [dbo].[APP_Employees] 
SET  [EmployeeTotalNumberOfAnnualLeave] = [EmployeeBalanceTheInitialNumberOfDaysOfAnnualLeaveIn] 
WHERE ID=@EmployeeID 

END
GO

并显示错误

  

Msg 2714,Level 16,State 2,Procedure EmployeeInsert,第17行
  数据库中已经有一个名为“EmployeeInsert”的对象。

1 个答案:

答案 0 :(得分:17)

您获得的错误是因为您已在数据库中拥有该触发器。因此,如果您想再次创建它,则需要首先删除现有触发器(或使用ALTER TRIGGER而不是CREATE TRIGGER来修改现有触发器。

你的根本缺陷是,你似乎期望触发器每行一次 - 这是 NOT SQL Server。相反,触发器会在每个语句时触发,而伪表Inserted可能包含多行

鉴于该表可能包含多行 - 您希望在这里选择哪一行?

SELECT @EmployeeID = ID FROM inserted 

未定义 - 您可以从Inserted中的任意行获取值。

您需要使用Inserted WILL 包含多行的知识重写整个触发器!您需要使用基于集合的操作 - 不要只期望Inserted中的一行!

-- drop the existing trigger
DROP TRIGGER [dbo].[EmployeeInsert] 
GO

-- create a new trigger
CREATE TRIGGER [dbo].[EmployeeInsert]
ON [dbo].[APP_Employees]
AFTER INSERT
AS 
BEGIN   
    SET NOCOUNT ON;

    -- update your table, using a set-based approach
    -- from the "Inserted" pseudo table which CAN and WILL
    -- contain multiple rows!
    UPDATE [dbo].[APP_Employees] 
    SET  [EmployeeTotalNumberOfAnnualLeave] = i.[EmployeeBalanceTheInitialNumberOfDaysOfAnnualLeaveIn] 
    FROM Inserted i
    WHERE ID = i.ID
END
GO