【发布时间】:2011-06-15 15:53:26
【问题描述】:
我得到了这个存储过程:
CREATE PROCEDURE getManagerSalary
(
@Emp_id INT,
@ManagerSalary MONEY OUTPUT
)
AS
SELECT @ManagerSalary = es.Salary
FROM [outdoorparadise].[dbo].[Employee] AS e
INNER JOIN
[outdoorparadise].[dbo].[Employee] AS m
ON e.Manager_id = m.Emp_id
INNER JOIN
[outdoorparadise].[dbo].[Employee_staff] AS es
ON e.Manager_id = es.Emp_staff_code
WHERE e.Emp_id = @Emp_id;
我得到了这个触发器:
CREATE TRIGGER checkSalary ON Employee_staff
AFTER UPDATE
AS
DECLARE
@Emp_id INT,
@NewSalary MONEY,
@ManagerSalary MONEY;
SELECT @NewSalary = Salary
FROM inserted;
SELECT @Emp_id = Emp_staff_code
FROM inserted;
EXEC getManagerSalary @Emp_id = @Emp_id,
@ManagerSalary = @ManagerSalary OUTPUT;
IF @NewSalary > @ManagerSalary
BEGIN
RAISERROR 60000 'Salary cannot be higher than the salary of the manager!'
ROLLBACK TRANSACTION;
END
ELSE
COMMIT TRANSACTION;
当我将薪水更新为高于经理薪水的值时,我收到加薪错误 + 此错误:事务在触发器中结束。该批次已中止。
当我尝试将薪水更新为低于经理薪水的值时,我仍然得到以下信息:事务在触发器中结束。该批次已中止。
谁能告诉我如何解决这个问题? 我搜索了,但找不到任何东西。
谢谢, 龙拳
PS:这是我的第一篇文章,也许我没有正确粘贴代码,所以我很抱歉。
【问题讨论】:
-
我需要对您的触发器发表评论 - 您犯了一个会导致问题的错误。触发器在 SQl 服务器中批量操作,您不能假设只会发送 1 条记录(即使您认为是所有将被发送的,它不会随着时间的推移而成立)。除非它是表变量,否则不应将值从插入的变量设置为变量。
标签: sql-server transactions batch-file triggers