我需要在同一个表中添加任何记录后更新表中的列
这是我的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”的对象。
答案 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