【发布时间】:2013-12-31 11:54:50
【问题描述】:
我有这个触发器,它在回滚时返回错误,错误是“事务在触发器中结束。批处理已中止。”
create trigger trigger1 on payments
for insert
as
set nocount on ;
begin
if(select COUNT(*) from customers c , inserted i where c.customer_id = i.customer_id) = 0
begin
rollback tran;
print 'Customer not found'
end
else
print 'ok'
end
【问题讨论】:
-
@NagarajS 好的只是糟糕的编程,但解决方案在哪里
-
使用触发器回滚外部事务并不是一个好主意,IMO 就像
@@Trancountwon't balance。建议要么只是从触发器引发错误/抛出,然后调用 proc 应该在假设它有错误处理程序的情况下回滚,或者更好的是,将存在检查添加到插入 proc/代码 - 这将使读者更清楚触发。 -
是的,正如@StuartLC 已经提到的,您在触发器中的回滚是导致此错误的主要原因。在此处查看另一篇有很好解释的帖子stackoverflow.com/questions/7310820/…
-
如果您想确保客户中存在 Payments.customer_id,为什么不添加 FOREIGN KEY 约束?另外,如果你真的不想回滚事务,你想在这里实现什么?
标签: sql sql-server triggers