Sql 回滚时触发错误

Sql 回滚时触发错误,sql,sql-server,triggers,Sql,Sql Server,Triggers,我有这个触发器,它在回滚时返回错误,错误是“事务在触发器中结束。批处理已中止。” 根据注释,尝试从触发器引发错误,而不是回滚(或)roolback,然后抛出/引发错误并从触发器返回,如下所示 create trigger trigger1 on payments for insert as set nocount on; begin if(select COUNT(*) from customers c join inserted i on c.customer_id = i.

我有这个触发器,它在回滚时返回错误,错误是“事务在触发器中结束。批处理已中止。”


根据注释,尝试从触发器引发错误,而不是回滚(或)roolback,然后抛出/引发错误并从触发器返回,如下所示

create trigger trigger1 on payments
for insert
as
set nocount on;
begin
    if(select COUNT(*) from customers c join inserted i 
    on c.customer_id = i.customer_id) = 0
        begin
        declare @errmsg VARCHAR(MAX), @sev AS INT, @state AS INT
        SELECT @errmsg = ERROR_MESSAGE(), @sev = ERROR_SEVERITY(), 
        @state = ERROR_STATE()
        print 'Customer not found'
        rollback transaction
        raiserror(@errmsg,@sev,@state);
      return
        end
     else
        print 'ok'
end

@NagarajS可以简单地说是糟糕的编程,但是解决方案在哪里使用触发器回滚外部事务在IMO中不是一个好主意。建议只从触发器引发一个错误/抛出,然后调用proc应该回滚,假设它有一个错误处理程序,或者更好的是,将exists检查添加到insert proc/code中-这将使读者比触发器更清楚。是,正如@StuartLC已经提到的,您返回触发器是导致此错误的主要原因。如果你想确保Payments.customer\u id存在于customers中,为什么不添加一个外键约束呢?此外,如果你真的不想回滚交易,你想在这里实现什么?插入一个不存在的客户号码时的相同错误“交易在触发器中结束”。批处理已中止。”
create trigger trigger1 on payments
for insert
as
set nocount on;
begin
    if(select COUNT(*) from customers c join inserted i 
    on c.customer_id = i.customer_id) = 0
        begin
        declare @errmsg VARCHAR(MAX), @sev AS INT, @state AS INT
        SELECT @errmsg = ERROR_MESSAGE(), @sev = ERROR_SEVERITY(), 
        @state = ERROR_STATE()
        print 'Customer not found'
        rollback transaction
        raiserror(@errmsg,@sev,@state);
      return
        end
     else
        print 'ok'
end